C# - 实现INotifyPropertyChanged到ObservableCollection

时间:2014-02-14 21:44:41

标签: c# listbox observablecollection inotifypropertychanged

使用 Windows Phone 8

所以我一直在玩ObservableCollectionListboxes并绑定他们,但我从未玩过INotifyPropertyChanged。我听说这会使很多事情变得更容易,即自动检测ObservableCollection中的某些内容是否会发生变化。

如果没有太多问题,有人可以向我提供一个具有以下功能的简单代码示例:

  • 添加
  • 删除

所以基本上只需将项目添加到ObservableCollection ,然后选择从ObservableCollection 中删除所选项目的按钮,这将更新ObsevableCollection。

只是因为我从未理解INotifyPropertyChanged是如何运作的。在线样本似乎对我不起作用,我所要求的只是一个简单的样本。

更新

我设法添加了ObservableCollection。

 public partial class MainPage : PhoneApplicationPage
 {
    public AddItems LoadItems = new AddItems();

    public MainPage()
    {
        InitializeComponent();
        listBox.DataContext = LoadItems;
    }

    public class Items
    {
        public string ItemTitle { get; set; }
        public string ItemBody { get; set; }
        public string FolderID { get; set; }
    }

    public class AddItems : ObservableCollection<Items>
    {
        public AddItems()
        {
            Add(new Items() { ItemTitle = "Book", ItemBody = "A simple Book.", FolderID = Count.ToString() });
            Add(new Items() { ItemTitle = "Paper", ItemBody = "Something to write on.", FolderID = Count.ToString() });
            Add(new Items() { ItemTitle = "Pen", ItemBody = "Something you use to write.", FolderID = Count.ToString() });
        }
    }

    private void Delete_Click(object sender, RoutedEventArgs e)
    {

    }
}

现在,如果我想从列表框中删除项目,我该怎么办?我试过了:

   LoadItems.Remove(listBox.SelectedItem);

但那没用。如何删除所选项目并让ObservableCollection自动检测到该更改并进行刷新,以便它不会显示已删除的项目?

谢谢!

2 个答案:

答案 0 :(得分:4)

ObservableCollection<T>已经实现了INotifyCollectionChanged,这使得无论何时在集合中添加或删除项目,都会通知UI。因此,例如,与数据绑定一起,只需调用ObservableCollection<T>.Add()函数就足以将项目添加到集合中,并通知UI显示新添加的项目而无需进一步努力。

INotifyPropertyChanged是另一回事。当底层属性的值发生变化时,它用于通知UI更新显示的值。

答案 1 :(得分:3)

您不需要INotifyPropertyChanged来处理Add / Remove方法:ObservableCollection<T>会为您处理这些问题。

当您需要屏幕更新时,您需要INotifyPropertyChanged当集合中已有的项目发生更改时,例如其中一个属性有不同的价值。

要实现这一目标,T必须实施INotifyPropertyChanged,而不是ObservableCollectinon本身。