我正在尝试WPF上的MVVM模式,并使用WCF数据服务从数据库中检索一些记录(即客户列表)。因此,从View Model中,我正在调用某个服务来检索所有客户。有没有办法跟踪对象客户在从视图进行更改时的更改?像EntityState这样的东西。
请帮助!
答案 0 :(得分:1)
您可以在实体上实施自己的更改跟踪行为。我有多个需要进行变更跟踪的实体,我建议使用通用基类来实现变更跟踪的核心功能。
但使用Entity的框架自我跟踪实体也是一种选择。关于使用STE的vs poco(Plain Old Clr Objects)实体已有很多帖子。见这里:
答案 1 :(得分:0)
如果您的ViewModel数据对象继承INotifyPropertyChanged
,那么您可以设置一个布尔属性来显示已经进行了更改。
答案 2 :(得分:0)
假设您有一个ViewModel类,其中包含名为“customers”的属性,该属性是一个客户列表。可以改变3件事:
WPF绑定机制可以处理所有情况,前提是您触发了正确的事件。取决于您的情况,每个可能发生的情况都必须处理。
只需说明您的客户集合无法更改,即可解决#1问题。也就是说,在构建ViewModel期间分配客户列表,并且不替换此属性。
对于#2,最好的方法是重用名为ObservableCollection的.NET对象。此集合实现了INotifyPropertyChanged,并在调用Add,Remove,Clear等时使用正确的参数触发正确的通知。
对于#3,您需要为Customer对象实现INotifyPropertyChanged。例如:
public class Customer : INotifyPropertyChanged
{
public PropertyChangedEventHandler PropertyChanged;
private string _name;
public string name {
get { return _name; }
set { _name = value; ... /* add code to fire exception */ }
}
... // more properties
}
现在,在您的视图模型中,有一个可观察的集合
public class ViewModel
{
public ObservableCollection<Customer> customers { get; private set; }
ViewModel( ) {
// Allocate it once during construction
customers = new Observablecollection<Customer>( )
}
}
在UI中,您只需要绑定。无论您使用什么ItemsControl:
<ItemsControl DataSource="{Binding customers}">
<!-- The template to display the items here -->
</ItemControl>
现在,您只需要将客户集合与服务器上的集合保持同步即可。您对客户所做的任何更改都将反映在用户界面中。