2011-07-05 8 views
6

私はベースビューモデルクラスの作成に取り組んでいます。 ViewModelBaseは抽象クラスであり、他のすべての派生ビューモデルを実装するために必要なプロパティを定義します。MVVMベースビューモデルクラス

特性の1つはのObservableCollectionである:この基本クラスから派生

public abstract ObservableCollection<???> Items { get; set; } 

クラスは(ObservableCollection<Person>ObservableCollection<Car>)定義されたアイテムの種類を有することになります。

私はViewModelBaseにobjectへのObservableCollectionのタイプを設定した場合、それが仕事を得るために派生クラスで異なるキャストの多くを行うために私を必要とします。

これは正しいアプローチですか?

答えて

11

私はあなたがそのように一般的なようにしたいなぜ非常にわからないんだけど、あなたがやった場合、私はあなたにも、抽象基底クラスがジェネリックにすることをお勧めします:

public abstract class ViewModelBase<T> 
{ 
    public abstract ObservableCollection<T> Items { get; set; } 
} 

私はあなたを願っていますまた、ViewModelBaseがINotifyPropertyChangedを実装していることを確認してください。

+0

感謝。私はジェネリック薬を完全に忘れているとは思えません。私がこのようにしている理由は、私のビューモデルの多くが若干の違いを除いてほとんど同じだからです。そのため、共通のものを基本クラスに入れたいと思っていました。 – Flack

2
public abstract ObservableCollection<TYPE> Items { get; set; } 

TYPEは、基本クラスを使用する/継承するときやInterfaceを含む多くの方法で定義できます。

0

CarとPersonの基本クラスになることができるいくつかのクラス{Entity}を定義します。あなたは+強い型指定を得ることができます。

0

あなたは次にあなたがのviewmodelsのリストが必要な場合、私はそれ以外の一般的な基本クラスを作成することをお勧めします。この

public abstract class ViewModelBase<T> 
{ 
    public abstract ObservableCollection<T> Items { get; set; } 
} 

のようなdefitionを持つことができ、あなたのベースクラスジェネリック

を作りたいです一般的な1がオフに継承し、その

public abstract class NonGenericBaseViewModel 
{ 
    ObservableCollection<object> ItemsAsObjects{get;set;} 
} 

public abstract class ViewModelBase<T> : NonGenericBaseViewModel 
{ 
    public ObservableCollection<T> Items { get; set; } 
} 

のリストを持っている、あなたは

を持つことができます
ObservableCollection<NonGenericBaseViewModel> 

あなたがのために、アプリケーション内のすべてのビューモデルをベースビューモデルを作成している場合は、

2

をしたい場合は、すべての単一のものが観測コレクションを開催しますことはほとんどありません。

ビューモデルに共通の機能を追加するために、継承の代わりにコンポジション(または継承と同様に)を使用することを検討できます。例えば

:このため

// Base for ALL view models implements necessary interfaces. 
public abstract class BaseViewModel : INotifyPropertyChanged, IDisposable 
{ 
    // Functionality useful to ALL view models 
    public string DisplayName { get; } 
    // etc. 
    ... 
} 

// Generic collection view model implementing functionality required by 
// all collection view models. 
public abstract class CollectionViewModel<T> : BaseViewModel 
{ 
    public abstract ObservableCollection<T> Items { get; set; } 
} 

// Specific collection view model using generic one through composition 
public class PersonCollectionViewModel : BaseViewModel 
{ 
    public CollectionViewModel<Person> PersonCollection { get; } 
    // other functionality not included in all collection view models. 
    // ... 
}