[英]Add editing to MVVM in a hierarchical data structure
這個問題是這個舊問題的后續問題,它更像是一個確認而不是一個開放的問題。
我的ViewModel實例有一個Model的私有實例_modelInst
。
ViewModel在編輯期間可以獨占訪問Model的數據(因此Model不需要實現INotifyPropertyChanged)。
現在我有三種方法可以從視圖中編輯模型數據:
直接在Model實例上獲取/設置
例如,對於簡單的值字段
return _modelInst.fieldname;
_modelInst.fieldname = value;
這個很容易實現......
創建ViewModel實例並對父數據結構進行操作
例如,對於更復雜的對象類型,如結構 :
這意味着為每個結構創建一個由父項實現的新接口(使用_modelInst
上的更新例程)。
創建ViewModel實例,而不直接了解父數據結構
例如,用於父類中的(列表)類
為每個類創建一個新的ViewModel
通過以下方式向父級發送更新說明
所有這些都是一個很大的混亂實現,為可編輯的模型的每個領域創建功能。
這幾乎意味着模型的所有領域......
(4.)可以創建一個通用的ViewModel,它只通過反射工作,其中每個子對象都知道它的父對象和它的字段名(+ index,如果在列表中)。
只有root的邏輯才會干擾模型。
但是該解決方案還需要一種方法來存儲_modelInst
字段的路徑。
有沒有其他(更簡單)的方法來實現這一目標?
我是否(再次)誤解了MVVM的原理?
MVVM是否適合處理大型分層數據結構?
這是一個很好的問題,我覺得MVC模式沒有一個好的答案。
ViewModels映射到的模型沒有子項時效果很好。
但是,當模型有孩子時,就像在
顧客
-->Order
-->Country
(想象國家是客戶的兒童對象)設計模式的類型分解。
我發現最好的事情是使用繼承並有選擇地只暴露那些你需要viewmodel邏輯的子代。 否則,只需訪問將通過繼承進入的視圖的模型屬性。
公共類CustomerView:客戶//繼承自Customer(model){
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 "";
}
}
與孫子女打交道時,這會變得混亂。 如果有人有更好的解決方案,我很樂意聽到。
謝謝
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.