1

我正在使用“ 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
        }
    }
}

问题来自上面的注释行: lambda inNotifyPropertyChanged将不起作用,因为m.AdditionalProperty不存在,因为m是 type A, not B。在这种情况下会发生什么?我应该注意,NotifyPropertyChanged它是工具包附带的,不是自定义实现。

编辑:这是NotifyPropertyChangedin的 IntelliSense 描述B

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

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

4

2 回答 2

2

问题在于他们如何实施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);
        }
    }
}

请注意,Anow 继承自ModelBase<T>not ModelBase<A>,并且您限制T为 be A<T>。然后,您B继承A并指定其泛型为B(实现A<T>)。

这是相当复杂的,我不确定他们为什么这样做——可能是因为有一些跨平台的东西需要他们这样做。如果您不需要它来进行跨平台工作,或者他们可能因为这个原因没有这样做,我建议您使用MVVM Light 之类的东西来满足您的 MVVM 需求。它有一个不同的实现NotifyPropertyChanged,不依赖于指定自己的类型,并减少了过度使用泛型的需要。

于 2014-06-28T02:19:52.033 回答
2

您不仅限于传递给 lambda 的参数的属性。您还可以在花括号的父集中(在您的情况下为 setter)中可引用的任何对象上使用属性。包括“这个”。

代替:

NotifyPropertyChanged(m => m.AdditionalProperty);

尝试:

NotifyPropertyChanged(m => this.AdditionalProperty);

如果您挖掘源代码,则传入的属性的字符串值是从 Expression 参数本身派生的。除了使用对象来获取它的属性之外,它根本没有被使用。它可能来自“this”,完全来自其他对象,等等。

于 2014-07-03T03:26:26.343 回答