繁体   English   中英

C#WPF中的“简单MVVM工具包”子模型类

[英]“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不存在,因为mA类型,而不是B类型。 在这种情况下会发生什么? 我应该注意, NotifyPropertyChanged随工具包一起提供,不是自定义实现。

编辑 :这是B NotifyPropertyChanged的IntelliSense描述:

void ModelBaseCore<A>.NotifyPropertyChanged<TResult>(System.Linq.Expressions.Expression<Func<A,TResult>> property)

允许您为通知属性更改指定一个lambda

问题在于他们如何实现ModelBase 他们显然不觉得有人会ModelBaseModelBase的模型,我不确定他们为什么会那样想。

无论如何,问题在于您在指定泛型时会告诉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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM