如何在WinRT中使用INotifyPropertyChanged?
我是一个新手,只是学习DataContext
和MVVM模型的基础知识。 我现在有一个网格绑定到一个实现INotifyPropertyChanged
的视图模型对象,但是看起来UpdateSourceTrigger
(所有WPF教程告诉我使用它)不适用于WinRT / Metro Style应用程序!
那我如何实现INotifyPropertyChanged呢?
我在这里的绳索尽头。 我花了将近一天的时间在最基本的应用程序示例上,只是在点击某些内容后尝试更新网格。 到目前为止,我设法做到这一点的唯一方法是创建一个全新的视图模型实例并重新分配我知道错误的DataContext
更新:
我取得了一些进展,但事情变得非常奇怪。 我有一个视图模型,带有一个通用的项目列表。 项目列表与PropertyChangedEventHandler连接。 如果我用新的集合替换整个集合,listview会更新。
model.Items = new List{ new DataItem{ Title = "new item" }};
这导致具有上述项目的一个项目列表。 但是,如果我尝试添加项目,则没有任何反应
model.Items.Add(new DataItem{ Title = "added item" });
我也尝试创建一个添加项目并专门解雇PropertyChanged的方法,但这也不起作用
这就是它变得奇怪的地方。 接下来我尝试了这段代码。
model.Items.Add(new DataItem { Title = "added item" }); model.Items = new List { new DataItem { Title = "new item" }};
这导致两个项目列表:
- new item - added item
怎么会这样? 代码说,“添加一个项目”然后“替换整个列表”但它以相反的顺序执行?
更新2:
我按照建议切换到了ObservableCollection,这实际上解决了原来的问题。 我现在可以添加一个项目,它会显示在列表中。
然而,新的怪异行为仍然有效。 重置集合之前添加的项目将附加到新集合的末尾。 为什么我的代码以相反的顺序执行?
您需要实现该接口,并在您关注的给定属性发生更改后发送通知。
public event PropertyChangedEventHandler PropertyChanged; public string CustomerName { get { return this.customerNameValue; } set { if (value != this.customerNameValue) { this.customerNameValue = value; if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs("CustomerName")); } } } }
请记住,对于集合,您应该使用ObservableCollection,因为它将处理在添加或删除项目时触发的INotifyCollectionChanged
。
我建议尽量缩小你的样本。 不要从DataGrid
开始,而是从简单的TextBox
和Button
, Button
强制改变ViewModel,然后在UI上反映。
代码取自这里 。
最好实现一个实现它的父类,如下所示:
public class NotifyPropertyChangedBase : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged = delegate { }; protected void RaisePropertyChanged(string propertyName) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } }
然后在您的属性的子类(即ViewModel)中执行以下操作:
public class MyViewModel : NotifyPropertyChangedBase { private string _name; public string Name { get{ return _name; } set{ _name = value; RaisePropertyChanged("Name"); } } }