2011-02-01 3 views
2

私はWinFormsの世界からMVVMを使ってWPFに移行しています。MVVMでPOCOを扱う

私の基本システムは、POCOクラス(NHibernateの)と連携し、我々はのModelViewはPOCOのプロキシを公開し、多くのコードを保存することができますので、いくつかのバインド可能にこのPOCOクラスをマッピングするために、いくつかのDynamicProxyを使用します。

public class OrderViewModel 
{ 
    public OrderPOCO Order { get; private set; } 
} 

public class OrderView 
{ 
    public OrderView() 
    { 
     DataContext = DynamicProxy(new OrderViewModel(new OrderPOCO())); 
    } 
} 

public class OrderPOCO 
{ 
    public virtual int Number { get; set; }; 
    public virtual IList<OrderItemPOCO> Items { get; set; }; 
} 

public class OrderItemPOCO 
{ 
    public virtual decimal Qty { get; set; } 
    public virtual decimal Price { get; set; } 
    public virtual decimal Amount { get; set; } 
} 

OrderItemPOCOのコレクションはグリッドにバインドされます。金額は、いくつかの複雑なルールに依存する計算されたプロパティです(単純な金額=数量*価格ではないため、POCOには入れることはできません)。

私はViewModelでカスタムOrderItemViewModelとOrderItemViewModelのコレクションを公開できますが、私はPOCOクラスを再コードする必要があります。どのように私はすべてのモデルをコードなしでMVVMのこの種の状況をコード化できますか?

答えて

4

あなたが正しいです、あなたはOrderItemViewModelが必要です。しかし、モデルクラスを書き直す必要はありません。同じままです。あなたが必要なのは次のようなものです:

public class OrderViewModel 
{ 
    public OrderViewModel(OrderPOCO order) 
    { 
     Order = order; 
     Items = new ObservableCollection<OrderItemViewModel>(order.Items.Select(o => new OrderItemViewModel(o)).ToArray()); 

     Items.CollectionChanged += OnItemsCollectionChanged; 
    }  

    public OrderPOCO Order { get; private set; } 

    public ObservableCollection<OrderItemViewModel> Items { get; private set; } 

    private void OnItemsCollectionChanged(object sender, CollectionChangedEventArgs e) 
    { 
     // Synchronize this.Items with order.Items 
    } 
} 

public class OrderItemViewModel 
{ 
    public OrderItemPOCO OrderItem { get; private set; } 
} 

public class OrderPOCO 
{ 
    public virtual int Number { get; set; }; 
    public virtual IList<OrderItemPOCO> Items { get; set; }; 
} 

public class OrderItemPOCO 
{ 
    public virtual decimal Qty { get; set; } 
    public virtual decimal Price { get; set; } 
    public virtual decimal Amount { get; set; } 
} 
+1

@ user598839、ViewModelを導入するためにPOCOクラスを書き直さなければならないのはなぜですか?結局のところ、MVVMのポイントは、ViewとModelが互いに透過的であるということです(実際、ViewModelはViewについてもわかりません)。 –

関連する問題