我有这个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集合的每个对象上检测模型更改?
答案 0 :(得分:0)
WCF合同是序列化对象,它们应被视为不可变的。
您要做的是拥有一个本地缓存,您可以将更改合并到有状态副本中。这可能就像将数据从合同映射到正确实现INotifyPropertyChanged的类一样简单。对于像AutoMapper这样的简单映射工具有很长的路要走。
对于更复杂的合并和差异,有Compare .NET Objects项目将提供精细的信息。
可能有用的其他工具是Reactive Extensions可观察集合,您可以在其中插入数据协定并订阅更改。
另一种选择是使用WCF实际转移到发布者 - 订阅者模型。 IDesign和Juval Lowy提供了Pub-Sub with WCF的准备实施。
答案 1 :(得分:0)
如果您的收藏正在更改,并且您需要获取更新的收藏,您可以使用 ObservableCollection 代替自动实现NotifyPropertyChanged事件的List。