2011-06-27 17 views
1

質問の混乱のタイトルに申し訳ありません。基本クラスから派生したViewModelとModelsを実装する方法については不明です。モデルとビューモデルの関係と継承 - どのように実装する必要がありますか?

私のViewModelクラスはViewModelBaseに基づいており、ViewModelBaseは他のすべてのモデルの基本クラスとして機能するModelBaseを保持しています。

各ViewModelはModelプロパティがModelBaseクラスとして基本ViewModelクラスで定義されているため、ModelBaseから関連するModelクラスにモデルをキャストする別のプロパティを作成する必要があります。

私の質問です - 簡単な解決策はありませんか?これらの問題に関連する設計パターンはありますか?

はここでのサンプルコードです:あなたが見ることができるように

public abstract class BasicViewModel : ViewModelBase 
{ 
    public BasicViewModel() 
    { 
    } 
    public ModelBase Model { get; set; } 
} 

public class ModelBase 
{ 
} 

public class ContainableViewModel : BasicViewModel 
{ 
    public ContainableViewModel(ContainableModel model) 
    { 
     this.Model = model; 
    } 

    public ContainableModel MyModel { get { return (ContainableModel)Model; } } 

    public int Children { get { return MyModel.Children; } set { MyModel.Children = value; } } 
} 

public class ContainableModel : ModelBase 
{ 
    public ContainableModel() 
    { 
     Children = 2; 
    } 

    public int Children { get; set; } 
} 

、「mymodelという」プロパティは、バグを私に1です。

ご協力いただきありがとうございます。

+0

ColinEの答えは、あなたのオブジェクトにどんなタイプのベースコレクションも使いたくない場合にのみ役に立ちます。コレクションを使用する場合は、元のコードが最も適切な答えと思われます。 –

答えて

2

各ビューのモデルは、モデルのプロパティが含まれている場合は、ジェネリックを使用することができます。以下のように

public abstract class BasicViewModel<TModelType> : ViewModelBase 
    where TModelType : ModelBase 
{ 
    public BasicViewModel(TModelType model) 
    { 
     Model = model; 
    } 

    public TModelType Model { get; set; } 
} 

public class ModelBase 
{ 
} 

あなた収容可能ビューモデルが定義されました:

public class ContainableViewModel : BasicViewModel<ContainableModel> 
{ 
    public ContainableViewModel(ContainableModel model) 
     : base(model) 
    { 
    } 

    // you can now omit this method, it is defined on the abstract superclass 
    //public ContainableModel Model { get { return()Model; } } 

    public int Children { get { return MyModel.Children; } set { MyModel.Children = value; } } 
} 

public class ContainableModel : ModelBase 
{ 
    public ContainableModel() 
    { 
     Children = 2; 
    } 

    public int Children { get; set; } 
} 
+0

ねえ、ありがとう!これは私の他の解決策でした。これは、より複雑なクラスで作業する場合、はるかに汚れていました。 – seren1ty

1

私は、一般的には使用しないでくださいViewModelオブジェクトとModelオブジェクトの間には1対1の対応関係がないため、さまざまなModelタイプの基本クラスです。さらに、Modelオブジェクトは一般にあまり共通していません。これはViewModelオブジェクトとは異なります。これらのオブジェクトはすべて、データバインディング経由で関連付けられているため、ViewModelインスタンスにバインドする方法を標準化するさまざまなヘルパーメソッドのメリットがあります。

Model-View-ViewModelの 'Model'は、ビジネスロジックとデータのやり取り(ユーザーとの視覚化や相互作用に関係しないもの)を提供するレイヤーです。CustomerWindowのCustomerViewModelは、Customerオブジェクトあなたのモデルレイヤーから、しかし、非常に可能性がありますあなたのモデルから、他のオブジェクトへの参照を持っている可能性がありますリポジトリのようなものです。あなたのMainWindowのような他のビューには、どのModelオブジェクトにも直接対応しないMainViewModelがあるかもしれませんが、おそらくあなたのモデルに少なくともいくつかの依存関係があります。

+0

ありがとうございます。しかし、いくつかの抽象的なモデルは、List、SortedList、Queue、Treeなどの共通のものがいくつかあります。多分抽象度が高すぎるかもしれませんが、基本モデルを使用することは可能です。私は、ビジネスロジックは別の場所、リポジトリアクションがそれらのモデルで動作するドメインである可能性があると主張したいと思います。データストア以上のものではありません。 –

関連する問題