如何检测WCF模型的更改?

时间:2015-12-10 00:22:19

标签: c# wcf propertychanged

我有这个ViewModel:

public class CombustiblesViewModel
{        
    public List<CombustiblesWCFModel> Combustibles{ get; set; }        

    public CombustiblesViewModel()
    {
        Combustibles = _svc.Combustibles_List(sTicket);                            
    }      
}  

Combustibles_List 从WCF服务返回一个列表。 我需要的是跟踪每个CombustiblesWCFModel对象的更改。所以我用这段代码扩展我的模型:

public CombustiblesWCFModel()
    {
        this.PropertyChanged += ChangedRow;   
    }

    private void ChangedRow(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "HasChanges") return;
        CombustiblesWCFModel p = (CombustiblesWCFModel)sender;            
        // Should Rise HasChanges Property on model, but it doesn't work
        p.HasChanges = true;
    }

    private bool _haschanges;
    public bool HasChanges
    {
        get
        {
            return _haschanges;
        }
        set
        {
            _haschanges = value;
            this.RaisePropertyChanged("HasChanges");
        }
    }
}

我的问题是HasChanges总是假的。我相信当从WCF服务返回模型时,PropertyChanged事件会被覆盖。

问题

那么如何在viewmodel集合的每个对象上检测模型更改?

2 个答案:

答案 0 :(得分:0)

WCF合同是序列化对象,它们应被视为不可变的。

您要做的是拥有一个本地缓存,您可以将更改合并到有状态副本中。这可能就像将数据从合同映射到正确实现INotifyPropertyChanged的类一样简单。对于像AutoMapper这样的简单映射工具有很长的路要走。

对于更复杂的合并和差异,有Compare .NET Objects项目将提供精细的信息。

可能有用的其他工具是Reactive Extensions可观察集合,您可以在其中插入数据协定并订阅更改。

另一种选择是使用WCF实际转移到发布者 - 订阅者模型。 IDesign和Juval Lowy提供了Pub-Sub with WCF的准备实施。

答案 1 :(得分:0)

如果您的收藏正在更改,并且您需要获取更新的收藏,您可以使用 ObservableCollection 代替自动实现NotifyPropertyChanged事件的List。