c# - 当我想删除其内容时,对象为空
问题描述
我正在做一些 WPF 项目,我想在其中创建一个方法,当我单击它时,它会从 ObservableCollection 中删除元素。但由于某种原因,它做得不对。我用调试器检查,当谈到我为删除元素调用方法的语句时,它表明我的对象(我调用所有方法)是空的或。无效的。我知道这是一个愚蠢的问题,并且肯定是非常愚蠢的错误,我忽略了它,但我找不到解决方法。
代码:
using Microsoft.VisualBasic;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace facebook {
/// <summary>
/// Interaction logic for prikazObjave.xaml
/// </summary>
public partial class prikazObjave : UserControl {
Oseba oseba = new Oseba();
public prikazObjave() {
InitializeComponent();
}
public prikazObjave(Oseba os) {
InitializeComponent();
oseba = os;
}
private void item_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
var TextBlockName = ((TextBlock)sender).Name;
string newValue = Interaction.InputBox("Vnesi novo vrednost", "New value", "", 0, 0);
if (newValue != "" && newValue != null) {
((TextBlock)sender).Text = newValue;
}
}
private void delete_post_event(object sender, MouseButtonEventArgs e) {
var temp = (StackPanel)sender;
Objava objava = (Objava)(temp.DataContext);
if(oseba.posts.Count > 1) { //<---here, oseba is null
try {
oseba.izbrisiObjavo(oseba, objava);
MessageBox.Show("Objava uspešno izbrisana");
}
catch (Exception ex) {
Console.WriteLine("Napaka pri brisanju objave\n\n" + ex.Message + "\n" + ex.StackTrace);
}
}
else {
Console.WriteLine("Seznam objav je prazen");
return;
}
}
private void dodajKomentarBtn_Click(object sender, RoutedEventArgs e) {
string vsebina = Interaction.InputBox("Vnesi komentar", "Komentiraj", "", 0, 0);
if (vsebina != "" && vsebina != null) {
oseba.dodajKomentar(vsebina);
}
}
}
}
这是从集合中删除元素的类方法:
public void izbrisiObjavo(Oseba oseba, Objava objava) {
if(objava != null) {
//posts.Remove(objava);
try {
//posts.Remove(posts.Where(i => i.Vsebina == objava.Vsebina).Single());
Objava temp = objava;
oseba.posts.Remove(temp);
}
catch(Exception e) {
Console.WriteLine("Napaka pri brisanju objave (Oseba)\n\n" + e.Message + "\n" + e.StackTrace);
}
}
else {
Console.WriteLine("objava je null\n");
return;
}
}
奥塞巴班:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
using System.Runtime.Serialization;
using System.IO;
using System.Collections.ObjectModel;
using System.Drawing;
using System.Windows.Forms;
namespace facebook {
[Serializable()]
public class Oseba : INotifyPropertyChanged {
private string ime;
private string priimek;
private int starost;
private string spol;
private string oMeni;
private string zaposlitev;
private string profilnaSlika;
private string naslovnaSlika;
ObservableCollection<String> solanje = new ObservableCollection<string>(); //vse vrste šolanja
ObservableCollection<Prijatelj> friends = new ObservableCollection<Prijatelj>(); //seznam prijateljev
ObservableCollection<Objava> posts = new ObservableCollection<Objava>(); //seznam objav
ObservableCollection<String> pocutje = new ObservableCollection<string>();
public Oseba() { }
public Oseba(string ime, string priimek, int starost, string spol, string oMeni, string zaposlitev) {
this.ime = ime;
this.priimek = priimek;
this.starost = starost;
this.spol = spol;
this.oMeni = oMeni;
this.zaposlitev = zaposlitev;
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName) {
if(PropertyChanged != null) {
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public void dodajPrijatelja(Prijatelj prijatelj) {
friends.Add(prijatelj);
}
public void dodajSolo(string sola) {
solanje.Add(sola);
}
public void dodajObjavo(string vsebina, string zasebnost, ObservableCollection<String> prijatelji, string datoteka, string kraj, string pocutje) {
posts.Add(new Objava(vsebina, zasebnost, prijatelji, datoteka, kraj, pocutje));
}
public void dodajPocutje(string path) {
pocutje.Add(path);
}
public void dodajKomentar(string vsebina) {
if(vsebina != null) {
try {
//posts[0].ko
}
catch (Exception e) {
MessageBox.Show("Napaka pri dodajanju komentarja!\n\n" + e.Message + "\n" + e.StackTrace);
}
}
else {
MessageBox.Show("Vnesite komentar!");
return;
}
}
public void izbrisiObjavo(Oseba oseba, Objava objava) {
if(objava != null) {
//posts.Remove(objava);
try {
//posts.Remove(posts.Where(i => i.Vsebina == objava.Vsebina).Single());
Objava temp = objava;
oseba.posts.Remove(temp);
}
catch(Exception e) {
Console.WriteLine("Napaka pri brisanju objave (Oseba)\n\n" + e.Message + "\n" + e.StackTrace);
}
}
else {
Console.WriteLine("objava je null\n");
return;
}
}
public void serialize(Oseba os) {
string dataFile = (@"C:\Users\Admin\Desktop\uv\data.xml");
profilnaSlika = @"E:\Šola\2. letnik\Zimski semester\Uporabniski vmesniki\facebook\images\tony_stark_profile_pic.jpg";
naslovnaSlika = @"E:\Šola\2. letnik\Zimski semester\Uporabniski vmesniki\facebook\images\tony_stark_timeline_pic.jpg";
try {
XmlSerializer mySerializer = new XmlSerializer(typeof(Oseba));
StreamWriter myWritter = new StreamWriter(dataFile);
mySerializer.Serialize(myWritter, os);
myWritter.Close();
}
catch(Exception ex) {
Console.WriteLine("Napaka pri serializaciji(metoda Serialize - razred Oseba)\n\n" + ex.Message + "\n" + ex.StackTrace);
}
}
public Oseba deserialize(string path = @"C:\Users\Admin\Desktop\uv\data.xml") {
Oseba os = new Oseba();
string dataFile = path;
try {
using (var sr = new StreamReader(dataFile)) {
var deserializer = new XmlSerializer(typeof(Oseba));
os = (Oseba)deserializer.Deserialize(sr);
}
}
catch (Exception ex) {
Console.WriteLine("Napaka pri deserializaciji\n\n" + ex.Message + "\n" + ex.StackTrace);
}
return os;
}
public void shrani() {
string dataFile = (@"C:\Users\Admin\Desktop\data.xml");
profilnaSlika = @"E:\Šola\2. letnik\Zimski semester\Uporabniski vmesniki\facebook\images\tony_stark_profile_pic.jpg";
naslovnaSlika = @"E:\Šola\2. letnik\Zimski semester\Uporabniski vmesniki\facebook\images\tony_stark_timeline_pic.jpg";
using (var stream = new FileStream(dataFile, FileMode.Create)) {
var XML = new XmlSerializer(typeof(Oseba));
XML.Serialize(stream, this);
}
}
public Oseba nalozi() {
Oseba os = new Oseba();
string dataFile = (@"C:\Users\Admin\Desktop\data.xml");
try {
using (var sr = new StreamReader(dataFile)) {
var deserializer = new XmlSerializer(typeof(Oseba));
os = (Oseba)deserializer.Deserialize(sr);
}
}
catch (Exception ex) {
var msg = ex.Message;
}
return os;
}
public void odstraniPrijatelja(int index) {
friends.RemoveAt(index);
}
/*
public void sortAsc() {
ObservableCollection<string> prijatelji = new ObservableCollection<string>(friends.OrderBy(i => i));
friends = prijatelji;
}
public void sortDecs() {
ObservableCollection<string> prijatelji = new ObservableCollection<string>(friends.OrderByDescending(i => i));
friends = prijatelji;
}
*/
public string Ime {
get { return ime; }
set {
ime = value;
OnPropertyChanged("Ime");
}
}
public string Priimek {
get { return priimek; }
set {
priimek = value;
OnPropertyChanged("Priimek");
}
}
public int Starost {
get { return starost; }
set {
starost = value;
OnPropertyChanged("Starost");
}
}
public string Spol {
get { return spol; }
set {
spol = value;
OnPropertyChanged("Spol");
}
}
public string OMeni {
get { return oMeni; }
set {
oMeni = value;
OnPropertyChanged("OMeni");
}
}
public string Zaposlitev {
get { return zaposlitev; }
set {
zaposlitev = value;
OnPropertyChanged("Zaposlitev");
}
}
public string ProfilnaSlika {
get { return profilnaSlika; }
set {
profilnaSlika = value;
OnPropertyChanged("ProfilnaSlika");
}
}
public string NaslovnaSlika {
get { return naslovnaSlika; }
set {
naslovnaSlika = value;
OnPropertyChanged("NaslovnaSlika");
}
}
public ObservableCollection<Prijatelj> Friends {
get { return friends; }
set { friends = value;
OnPropertyChanged("Friends");
}
}
public ObservableCollection<String> Solanje {
get { return solanje; }
set {
solanje = value;
OnPropertyChanged("Solanje");
}
}
public ObservableCollection<Objava> Posts {
get { return posts; }
set {
posts = value;
OnPropertyChanged("Posts");
}
}
[XmlIgnore]
public ObservableCollection<String> Pocutje {
get { return pocutje; }
set {
pocutje = value;
OnPropertyChanged("Pocutje");
}
}
}
}
解决方案
我分块调试我的程序,我发现在构造函数调用完成后,userControl 中名为 PrikazObjave 的每个全局变量都为空。
推荐阅读
- c - 使用泰勒级数计算罪返回大数字
- r - 在 terra 包中读取多个栅格
- html - 如何使表格的标题变粘?
- spring-boot - Spring Boot Themeleaf TemplateInputException:HTTP 500
- cmake - 无法将 gtest_main 作为外部静态库与 cmake 和 Cygwin 链接。i686-pc-cygwin/bin/ld: 找不到 -lgtest_main
- python - Python未定义变量'rg'
- powershell - 用于复制旧文件并创建快捷方式的 Powershell 脚本
- python - Python:在 json.dumps() 中选择特定列
- python - 从python中的两个不同数据集中选择值
- typescript - Typescript 使用 Compiler API 推断类型参数