2010-07-29 38 views
5

此問題是this older之一的後續行爲,它不僅僅是一個確認而是一個未解決的問題。在分層數據結構中向MVVM添加編輯

我的ViewModel實例有一個模型的私人實例,_modelInst
在編輯過程中,ViewModel擁有模型數據的獨佔訪問權限(因此模型不需要實現INotifyPropertyChanged)。

現在有三種方式,我想出瞭如何從視圖編輯模型數據:

  1. 獲取/直接在模型實例設置
    例如對於簡單值字段
    return _modelInst.fieldname;
    _modelInst.fieldname = value;
    這一個容易實現......

  2. 創建一個視圖模型實例,並在父母的數據結構,操作系統
    例如對於更復雜的對象類型,如結構

    • 創建一個新的視圖模型爲該類型。
      ViewModel知道父級及其字段名。
    • 顯示,在一個ContentControl中+的DataTemplate
    • 獲取/設置:
      經由與字段名作爲參數,
      覆蓋即使只有一個字段被改變了整個原始對象的父的方法

    這意味着創建一個新的接口(其中更新例程在_modelInst上工作),由父級爲每個這樣的結構實現。

  3. 創建視圖模型實例與父的數據結構並不直接瞭解
    例如用於經由

    1. 命令父類

      • 創建新的視圖模型爲每個類

      • 發送更新指令到母體內(列表)類

      • 消息
      • 反射(父母通過比較實例知道哪個孩子稱爲功能
        將所有存儲的兒童)

    所有這些都是一團糟實施,爲 創建功能是編輯模型的各個領域。
    這意味着該模型的幾乎所有領域..​​.

(4)人們可以創建一個通用的視圖模型,其通過反射單獨工作,其中每個子對象 知道其母公司和其字段名(+索引,如果在列表中)。
只有根的邏輯會干擾模型。
但是,該解決方案還需要一種方法來存儲路徑到_modelInst內的字段。

是否有任何其他(更爲簡單)的方式來實現這一目標?
我誤解了MVVM的原理嗎?
MVVM是否適合處理大型分層數據結構?

+0

假設顧客作爲模型對象,創建一個實現的ICommand對象要CustomerViewModel:RetrieveCustomer,CreateCustomer,UpdateCustomer,DeleteCustomer(Customer類型的每次服用參數)。然後,您的視圖應綁定到這些ICommand對象,併發送一個類型爲Customer的CommandParameter(很可能是視圖中某處的綁定)。 – 2011-06-07 20:57:13

+0

這適用於平面結構,例如客戶列表。但是如果我有一個更復雜的樹層次結構,比如'list contacts',其中'contact'是'business,customer,private'的基類,'business'有一個'list '......? – 2011-06-08 07:29:42

+0

每個模型都有一個單獨的ViewModel,是嗎?對於派生類,您可以嘗試「Business business = contact as Business」;如果(business!= null)[做與商業相關的東西]' – 2011-06-08 16:03:15

回答

0

這是一個很好的問題我不覺得有一個很好的答案,與MVC模式的股票。

的ViewModels工作的偉大當模特它們映射到沒有孩子。

但是,當模型有孩子,在

客戶

 -->Order 

     -->Country 

(想象國家是客戶的子對象)的設計圖案種類休息下來。

我發現最好的辦法是使用繼承和選擇性地暴露 只需要從中獲得視圖模型邏輯那些孩子。否則,只需訪問將通過繼承進入的視圖的模型屬性。

公共類CustomerView:客戶//繼承客戶(模型) {

public CustomerView(Customer customer) 
{ 
     this.FirstName = customer.FirstName 
     //etc.. 

     //Only if you need it, that is if you have some display-specific 
     //logic relating to country for a given view, you create 
     //a CountryView class that inherits from Country and gets populated 
     //by an instance of it as well 
     this.CountryView = new CountryView(customer.Country) 
} 

public CountryView CountryView {get;set;} //sadly you cannot override Country but you may be able to shadow it. 

public string DisplayColor 
{ 
    if(base.FirstName == "Joe") 
    { 
     return "red"; 
    } 
    return ""; 
} 

}

與孫子時,這就會變得混亂。如果有人有更好的解決方案,我很樂意聽到它。

由於