簡體   English   中英

C#MVVM TreeView雙向數據綁定

[英]C# MVVM TreeView TwoWay-Binding of hierarchical data

我用谷歌搜索了兩個多星期了。 這通常意味着我要么是盲目的,要么是荒謬的。 無論如何:

在一個中等規模的,相當靈活的項目中,我將配置數據存儲在這樣的分層結構中:

  • 配置(集合)
    1. 音頻(類)
      • BaseDir(結構)
      • PlayMode(枚舉)
      • 輸入(類)
      • CalibrateOnConnect(布爾)
      • KnownDevices(集合)
        1. ...(班級)
          • ...
      • UseDevice(整數)
      • 播放列表(收藏夾)
        1. FirstAudio(類)
          • 路徑(字符串)
          • 重復(整數)
      • ...

我已經設法以MVVM模式在TreeView中顯示這些內容。 由於我無法確切判斷將來會添加哪些選項,因此我使用了一種通用方法,為classienumerable ,我的自定義structs和基本值類型( stringboolenum ,...)創建了ViewModels。

在我的XAML中,它們具有對應的(層次)數據模板,例如,帶有用於布爾值的CheckBox或用於常規值類型的文本塊。

每個ViewModel實例都有一個字段來存儲基礎Model的數據。

我設法在View中以及通過ViewModel中的TwoWay-Binding編輯這些值。
但是令我頭疼的是如何在Model中更新此數據。
由於我通過反射創建了分層的ViewModel結構,因此父級沒有對應於等效配置類/集合的字段名稱/索引器/ ...的獲取/設置屬性。 盡管每個ViewModel實例都知道其父模型的數據結構的字段/屬性名稱,但它還是從其父ViewModel實例(而不是其父Model實例)創建的。
通過命令或調用某些父母的更新函數來解決此問題的每一次嘗試都使我心煩。

沒有通過常規綁定技術實現此目的的簡單方法嗎?
如果為正在使用的每個配置(子)類創建ViewModels會更好嗎?
提示:每個ViewModel實例在父級模型的數據結構中都知道其字段/屬性名稱。

通過閱讀這些評論,我認為視圖模型應該與它試圖表示的模型緊密耦合。 擁有動態視圖模型也很難測試。

但是,如果您真的想嘗試解決此問題,則可以考慮使用DynamicObject ,它允許您以完全通用的方式獲取/設置實例的屬性。 使用DynamicObjects,您將獲得在設置或獲取屬性時調用的掛鈎,例如,這將使您(例如)引發給定動態屬性的NotifyPropertyChange事件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM