在WPF兼容属性中包装属性以实现INotifyPropertyChanged

时间:2014-08-13 14:34:55

标签: c# wpf mvvm inotifypropertychanged

在我的WPF应用程序中,我的Model类继承自类ParentClass

Model : ParentClass, INotifyPropertyChanged

我的应用程序仅用于提供用于测试和验证ParentClass的UI。因此,Model实际上只不过是INotifyPropertyChanged

ParentClass实施方案。

但是我仍然需要访问该父类的数据并让它对UI做出响应。

假设SlicingParentClass中的属性,而WPFSlicingModel中的属性,这就是我目前正在做的事情。我将每个父属性包装在WPF兼容的属性中。

public Thickness WPFSlicing
{
    get { return Slicing; }
    set
    {
        Slicing = value;
        OnPropertyChanged("Slicing");
    }
}

有更聪明的方法吗?我的父类中有很多属性,这似乎是一种非常缺乏灵感的方法。

2 个答案:

答案 0 :(得分:1)

这是一个非常有趣的问题。

通常,我发现在MVVM应用程序中,您试图将模型隔离为视图模型的最终结果 - 产品/数据片段。例如,如果你有一个自行车商店,你会看到Storefront作为View,Sales Person作为ViewModel(假设这是一个可定制的自行车,按订单生产),Model作为完成的Bicycle对象。

在建造自行车的情况下,它是在"原型设计"需要表示的阶段,我倾向于将其包含在ViewModel中 - 因为它中存在逻辑。这似乎是一个额外的步骤,但最终,您可以在构建它时在该ViewModel上进行验证。如果您的模型不灵活,无法添加INotifyPropertyChanged(或者它是从服务生成的),如果您有" 0"那么您将遇到问题。自行车上的轮胎 - 这应该会引起问题!

许多人倾向于变得更加懒惰,并将MVVM视为一种模式,将模型中的原型模型(数据输入来回,更新)抽象出来 - 当它们实际上应该是ViewModels时。

根据这个例子,我会有一个MVVM目录,如下所示:

Models
  -Bicycle (an object that can be passed across a service, etc -- data)
Views
  -BicycleCreatorView (the view or data template of the model)
  -StoreFrontView (the view of the entire store/app)
ViewModels
  -BicycleCreatorViewModel (the view model which CONSTRUCTS a Bicycle model as the end     result)
  -StoreFrontViewModel (the view model for the entire store)

现在,你可以很容易地让BicycleCreatorViewModel有一个构造函数,它接受一个Bicycle模型并预先填充。这并不罕见。有人可能会进店并说,#嘿嘿,你能把它变成另一个吗?这就是它的样子。"虽然最终结果是有另一个属性(可能只是一个get {})实际上呈现了一个Bicycle对象,但是IF验证是好的,我们不会有一些不寻常的0轮胎,没有座位(也许那个&#39) ; sa功能?)等。

因此,简而言之 - 为此,我总是将你的模型(如果你不能以任何方式扩展它)包装到它的OWN ViewModel中。那将是真正的MVVM模式。您可以随时使用ReactiveUI或其他可以包装属性的工具包。您可能会花费更多时间来做这件事,但最终产品将比其他方式更灵活,更不容易出错。基本上你已经这样做了,但你可能会重写它所以看起来更清洁"并绘制了这条线。

理论上,你也可以检查一下你是否可以用这样的方法来接近它:

您是否可以使用面向方面的工具包?也许让你的类部分包含在扩展名上的INotifyPropertyChanged然后XmlIgnore某些部分,如果序列化是一个问题/有问题吗?

问题是我们对模型的来源以及您如何使用模型知之甚少。希望有助于或给你一个有趣的想法。很想知道你是否想出一个更具灵感的解决方案"比标准。

答案 1 :(得分:0)

我提供了另一种观点。这一切都可以通过AOP框架(例如PostSharp)极其简单地解决。您执行全部,将 [NotifyPropertyChanged] 属性附加到您的班级,并且您的模型已将所有内容都连接起来。

http://www.postsharp.net/aspects/examples/inotifypropertychanged

但要注意,它需要花费,但它可以是很好的投资,imo。

Ps,它的问题,但我没有看到让所有DOMAIN模型类实现 INotifyPropertyChanged 有什么问题。它并没有扼杀性能,唯一的缺点是它会使代码变得混乱。这就是我所做的,我的域模型实体从 CommonEntity INotifyPropertyChanged 实现。 INotifyPropertyChanged不是WPF的一部分

它有效,并且绝对比将模型包装在视图模型中更好。