如何在WinRT中使用INotifyPropertyChanged



我是个新手,只是学习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开始,而是从简单的TextBoxButton开始,其中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");
}
}
}

相关内容

  • 没有找到相关文章

最新更新