[英]“Simple MVVM Toolkit” child Model classes in C# WPF
我正在使用“ Simple MVVM Toolkit ”(此处为MVVM
noob)来开发C#WPF应用程序。
我有一个名为A
的模型类:
public class A : ModelBase<A>
{
//properties, constructors, methods..
}
..和另一个名为B
模型类,该模型类继承自A
但公开了A
没有的属性:
public class B : A
{
private string additionalProperty;
public string AdditionalProperty
{
get { return additionalProperty; }
set
{
additionalProperty = value;
//NotifyPropertyChanged(m => m.AdditionalProperty); <-- problem here
}
}
}
问题来自上面的注释行: NotifyPropertyChanged
的lambda将不起作用,因为m.AdditionalProperty
不存在,因为m
是A
类型,而不是B
类型。 在这种情况下会发生什么? 我应该注意, NotifyPropertyChanged
随工具包一起提供,不是自定义实现。
编辑 :这是B
NotifyPropertyChanged
的IntelliSense描述:
void ModelBaseCore<A>.NotifyPropertyChanged<TResult>(System.Linq.Expressions.Expression<Func<A,TResult>> property)
允许您为通知属性更改指定一个lambda
问题在于他们如何实现ModelBase
。 他们显然不觉得有人会ModelBase
从ModelBase
的模型,我不确定他们为什么会那样想。
无论如何,问题在于您在指定泛型时会告诉ModelBase
使用哪种类型进行解析: ModelBase<A>
。 为了解决这个问题,您必须做一些看起来有些愚蠢的相当复杂的通用游戏:
public class A<T> : ModelBase<T> where T : A<T>
{
//properties, constructors, methods..
}
public class B : A<B>
{
private string additionalProperty;
public string AdditionalProperty
{
get { return additionalProperty; }
set
{
additionalProperty = value;
NotifyPropertyChanged(m => m.AdditionalProperty);
}
}
}
请注意, A
现在继承自ModelBase<T>
而不是ModelBase<A>
,并且您将T
约束为A<T>
。 然后,你必须B
从继承A
并指定其作为通用B
(实现A<T>
这相当令人费解,而且我不确定他们为什么要这样做—可能是因为有些跨平台的事情要求他们这样做。 如果您不需要跨平台的工作,或者由于这个原因他们可能没有这样做,我建议您使用诸如MVVM Light之类的产品来满足MVVM的需求。 对于NotifyPropertyChanged
,它具有不同的实现,该实现不依赖于指定其自己的类型,并减少了对泛型的过度使用的需求。
您不仅限于传递给lambda的参数的属性。 您还可以在大括号(在您的情况下为setter)的父级集合内可引用的任何对象上使用属性。 包括“这个”。
代替:
NotifyPropertyChanged(m => m.AdditionalProperty);
尝试:
NotifyPropertyChanged(m => this.AdditionalProperty);
如果您深入研究源,则传入的属性的字符串值是从Expression参数本身派生的。 除了使用对象获取其属性外,根本不使用它。 它可能来自“ this”,也可能完全来自其他对象,等等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.