我是个新手,只是学习DataContext
和MVVM模型的基础知识。我现在有一个绑定到视图模型对象的网格,它实现了INotifyPropertyChanged
,但是UpdateSourceTrigger
(所有WPF教程都告诉我要使用)似乎不适用于WinRT/Metro-Style应用程序!
那么我该如何实现INotifyPropertyChanged?
我在这里已经穷途末路了。我几乎花了一整天的时间在最基本的应用程序示例上,只是想在点击某个东西后更新一个网格。到目前为止,我成功做到这一点的唯一方法是创建视图模型的一个全新实例,并重新分配DataContext
,我知道它是错误的
更新:
我已经取得了一些进步,但事情变得很奇怪。我有一个视图模型,其中包含一个通用的项目列表。项目列表与PropertyChangedEventHandler连接。如果我用新集合替换整个集合,则列表视图将更新。
model.Items = new List<DataItem>{ 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<DataItem> { 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");
}
}
}