在我的WPF应用程序中,我的Model
类继承自类ParentClass
:
Model : ParentClass, INotifyPropertyChanged
我的应用程序仅用于提供用于测试和验证ParentClass
的UI。因此,Model
实际上只不过是INotifyPropertyChanged
ParentClass
实施方案。
但是我仍然需要访问该父类的数据并让它对UI做出响应。
假设Slicing
是ParentClass
中的属性,而WPFSlicing
是Model
中的属性,这就是我目前正在做的事情。我将每个父属性包装在WPF兼容的属性中。
public Thickness WPFSlicing
{
get { return Slicing; }
set
{
Slicing = value;
OnPropertyChanged("Slicing");
}
}
有更聪明的方法吗?我的父类中有很多属性,这似乎是一种非常缺乏灵感的方法。
答案 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的一部分!
它有效,并且绝对比将模型包装在视图模型中更好。