首页 > 解决方案 > 当我想删除其内容时,对象为空

问题描述

我正在做一些 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");
            }
        }        
    }
}

标签: c#

解决方案


我分块调试我的程序,我发现在构造函数调用完成后,userControl 中名为 PrikazObjave 的每个全局变量都为空。


推荐阅读