[英]“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.