跟踪视图模型中实体的更改

时间:2012-01-17 08:44:56

标签: wpf wcf mvvm

我正在尝试WPF上的MVVM模式,并使用WCF数据服务从数据库中检索一些记录(即客户列表)。因此,从View Model中,我正在调用某个服务来检索所有客户。有没有办法跟踪对象客户在从视图进行更改时的更改?像EntityState这样的东西。

请帮助!

3 个答案:

答案 0 :(得分:1)

您可以在实体上实施自己的更改跟踪行为。我有多个需要进行变更跟踪的实体,我建议使用通用基类来实现变更跟踪的核心功能。

但使用Entity的框架自我跟踪实体也是一种选择。关于使用STE的vs poco(Plain Old Clr Objects)实体已有很多帖子。见这里:

Introduction to ADO.NET Entity Framework

STE's vs Poco entities

STE's vs Poco

答案 1 :(得分:0)

如果您的ViewModel数据对象继承INotifyPropertyChanged,那么您可以设置一个布尔属性来显示已经进行了更改。

答案 2 :(得分:0)

假设您有一个ViewModel类,其中包含名为“customers”的属性,该属性是一个客户列表。可以改变3件事:

  1. 视图模型中的customer属性(即您使用以下命令更改整个列表:this.customers = new list
  2. 您可以在列表中添加或删除项目。
  3. 列表中已有特定客户的财产变更(例如客户[0] .address ='xxx';
  4. 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>
    

    现在,您只需要将客户集合与服务器上的集合保持同步即可。您对客户所做的任何更改都将反映在用户界面中。