0

我在我的列表视图中绑定了我的ViewModel中的observableCollection项(我有两个列表视图,每个都有自己的observableCollection)。我还将几个状态栏属性限制在ViewModel中的属性。如何在模型更改但没有属性更改时通知MVVM中的视图

在我的视图模型中,我有一些特殊的复制/粘贴功能,复制'内存'缓冲区'。实际上,我的视图模型(和下面的模型)中的属性只不过是指向这些内存缓冲区的“指针”。复制时我知道属性被改变了,但是值本身没有被setter改变(所以INotifyPropertyChanged没有被调用)。

如何刷新列表视图? 状态栏并不那么难,因为我可以调用视图模型中的方法来重新计算值。但是,对于列表视图的数据来说是非常不切实际的。

在非MVVM中,我只是用数据重新填充它们,但这不可能(我认为)与MVVM /绑定。

+1

复制这些“内存缓冲区”时不能提出正确的通知吗?你并不总是需要依赖财产制定者。 – Bernard 2012-02-21 17:28:45

+0

是喜欢做一个不存在的字符串(如属性'内存'),并通过重新填充列表视图对我的看法作出反应?我认为这被认为是一个肮脏的伎俩。 – 2012-02-21 17:30:15

+2

难道你不能手动引发PropertyChanged事件来告诉UI更新吗? 'RaisePropertyChanged(“SomeProperty”);' – Rachel 2012-02-21 17:34:41

回答

2

所以,在你的视图模型,你有一个项目一个ObservableCollection(说的ObservableCollection)。您需要做的是确保MyItem(即集合中的每个项目)都从INotifyPropertyChanged派生。然后,当您更改集合中的项目时,触发PropertyChanged事件。 WPF列表视图将会提取它。

其他评论者描述的RaisePropertyChanged是一种通常添加到VM类(通常是添加到所有VM类的通用基类)的实用工具方法。它引发PropertyChanged事件:

protected void RaisePropertyChanged(string prop) { 
    if(PropertyChanged != null) { 
     PropertyChanged(this, new PropertyChangedEventArgs(prop)); 
    } 
} 

正如评论者的其他描述,没有什么是决定你只能从二传手内提出一个PropertyChanged事件。在您的Copy方法中,只需使用适当的属性名称调用RaisePropertyChanged(您可以多次调用它,对于每个已更改的属性)。编辑:对于状态行,如果你想遵循MVVM设计模式,你不应该从VM调用方法到视图(这是MVVM中的一个关键概念:ViewModel是View不可知的)。您应该简单地为所有控制状态行的属性调用RaisePropertyChanged方法。

+0

感谢您的答案......提出多个事件似乎是要走的路,因为我知道在大多数情况下哪些列表视图项目被更改;如果我不这样做,我可以将它们全部提出或者为完整的列表视图提出事件。 – 2012-02-21 19:06:45

0

根据注释解决方法:

复制这些内存缓冲区时,提出一个适当的通知:使用

RaisePropertyChanged("SomeProperty") 
相关问题