如何在更改模型但未更改属性时通知MVVM中的视图

时间:2012-02-21 17:20:22

标签: wpf listview mvvm observablecollection inotifypropertychanged

我已经在列表视图中将项目绑定到我的ViewModel中的observableCollection(我有两个列表视图,每个视图都有自己的observableCollection)。我还将几个状态栏属性绑定到ViewModel中的属性。

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

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

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

2 个答案:

答案 0 :(得分:2)

因此,在您的视图模型中,您有一个ObservableCollection项(比如ObservableCollection)。您需要做的是确保 MyItem (即集合中的每个项目)都来自INotifyPropertyChanged。然后,当您更改集合中的项目时,触发PropertyChanged事件。 WPF列表视图将提取它。

其他评论员描述的RaisePropertyChanged是一种通常添加到VM类的实用程序方法(通常是所有VM类的公共基类)。它引发了PropertyChanged事件:

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

正如其他评论家所描述的那样,没有任何东西可以指示你只在setter中引发一个PropertyChanged事件。在Copy方法中,只需使用适当的属性名称调用RaisePropertyChanged(对于每个已更改的属性,您可以多次调用它)。

编辑:对于状态行,如果要遵循MVVM设计模式,则不应将方法从VM调用到View(这是MVVM中的关键概念:ViewModel是View不可知)。您应该只为所有控制状态行的属性调用RaisePropertyChanged方法。

答案 1 :(得分:0)

根据评论解决方案:

复制这些内存缓冲区时,请提出正确的通知:使用

RaisePropertyChanged("SomeProperty")