我已经在列表视图中将项目绑定到我的ViewModel中的observableCollection(我有两个列表视图,每个视图都有自己的observableCollection)。我还将几个状态栏属性绑定到ViewModel中的属性。
在我的视图模型中,我有一些特殊的复制/粘贴功能可以复制'内存'缓冲区'。实际上,我的视图模型(以及下面的模型)中的属性只不过是指向这些内存缓冲区的“指针”。复制时我知道属性已更改,但值本身不会被setter更改(因此不会调用INotifyPropertyChanged)。
如何刷新列表视图? 状态栏并不困难,因为我可以在视图模型中调用方法来重新计算值。但是对于列表视图的数据是非常不切实际的。
在非MVVM中,我只是用数据重新填充它们,但这是不可能的(我认为)与MVVM /绑定。
答案 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")