【发布时间】:2011-11-26 18:10:12
【问题描述】:
在我的 WPF 应用程序中,我使用 WCF 服务来获取数据。
所以很自然,在某些时候我有“复杂”的对象,需要将 DataContract 作为一个整体传递给 WPF 应用程序。
当然,现在我需要响应更改,并在我的 ViewModel 上实现 INotifyPropertyChanged,但是由于某些对象实际上是 DataContract,我必须重新组合这些对象,以便它们实现 INotifyPropertyChanged。
我觉得它很乱。
我试图做的是直接在 DataContract 定义上实现接口,但我无法对更改做出正确反应。
例如,如果双向数据绑定TextBox 的文本已更改,我的 ViewModel 应通过更改相应 SQL 表中的值(通过 WCF 服务)来对其做出反应,但由于对象是在 WCF 端定义的,我在属性的设置器中不能这样做。
我现在要做的是订阅 DataContracts 的 PropertyChanged 事件,并使用反射来知道哪个属性发生了变化以及它的新值。
但是这些对象保存在ObservableCollection<T> 中,这是很多事件,而且感觉很脆弱……例如,如果我从集合中添加/删除一个元素怎么办?
我这样做(我认为这很糟糕):
foreach (ImageInfo imgi in (param.Images as ObservableCollection<ImageInfo>))
{
imgi.PropertyChanged += (sender, args) =>
{
object newValue = Tools.GetProperty((sender as ImageInfo), args.PropertyName);
};
}
然后我会将其发送回 WCF 服务。
有没有更优雅的解决方案?我应该只在 ViewModel 上实现 INotifyPropertyChanged,然后重新组合 DataContracts 吗?
谢谢!
【问题讨论】:
-
我可以解释一下我是如何做到这一点的。数据合约是普通对象。视图模型接收数据契约作为构造函数参数并填写自己的属性。用户单击保存按钮后 - 视图模型收集新值,构造新数据契约并将其发送到服务。
-
是的,但是我没有“保存”按钮,每次属性更改时我都需要调用服务以反映数据库中的更改。
-
难度更大,增加了数据库的工作量。但是如果我有这样的要求,我也会这样做:创建新的数据合约并将其发送到服务,即使数据合约只有一个属性不同。如果向 RaisePropertyChanged 方法添加额外的方法调用,则可以处理实时更改。在主视图模型中调用 Save 方法或使用子项中的某种 Messenger 类。
标签: wpf wcf architecture inotifypropertychanged