簡體   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