2010-07-15 108 views
0

現在我搜索了兩個多星期的答案。這通常意味着我是盲人或者這個想法是荒謬的。不管怎麼說:C#MVVM TreeView雙向綁定的分層數據

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

  • 配置(集合)
    1. 音頻(類)
      • 的BaseDir(結構)
      • PLAYMODE(枚舉)
      • 輸入(類)
      • CalibrateOnConnect(布爾)
      • KnownDevices(集合)
        1. ...(類)
          • ...
      • UseDevice(整數)
      • 播放列表(收藏)
        1. FirstAudio(類)
          • 路徑(串)
          • 重複(整數)
      • ...

我已經管理顯示y這些在MVVM模式中的TreeView中。因爲我不能確切地告訴哪些選項將在未來被添加,我用了一個通用的方法,用於創建的ViewModels classienumerable,我的自定義structs和基本的值類型(stringboolenum,...)。

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

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

我設法在View中編輯這些值,並通過ViewModel中的TwoWay-Binding來編輯這些值。
但是,讓我頭疼的是如何更新模型中的這些數據。
由於我通過反射創建了分層ViewModel結構,因此父級沒有與等效配置類/集合的字段名稱/索引器/ ...相對應的get/set屬性。儘管每個ViewModel實例都知道父級模型的數據結構的字段/屬性名稱,但是該父級模型的數據結構是從其父級ViewModel實例創建的,並且也知道它的父級模型實例。
通過命令或通過調用父母的某個更新函數來解決此問題的每一次嘗試都爲我的大腦注入了活力。

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

+0

通過爲'string','bool','enum','ienumerable',*等創建視圖模型,你獲得了什麼?爲什麼不直接綁定到這些?如果視圖模型不知道如何操作模型,那麼我根本不會認爲它是一個視圖模型。 – Jay 2010-07-15 17:07:04

+0

由於類的ViewModel不知道它包含哪些確切的字段,因此任何類的TreeViewItem都包含每個字段和參數的子項,這些子項可能本身又是一個類。 從C++中思考我會使用一些引用來存儲指向該字段的「指針」(正在特定ViewModel的構造函數調用中訪問)。 – 2010-07-16 07:03:08

+0

我現在明白,沒有像「通用ViewModel」這樣的東西,我認爲這很讓人傷心。相反,對於任何Model類,必須有一個特定的ViewModel和一個特定的View。 – 2010-07-27 13:36:02

回答

1

通讀評論我認爲,視圖模型應該緊密耦合到它試圖表示的模型。擁有動態視圖模型也很難測試。但是,如果您真的想嘗試解決這個問題,可以考慮使用DynamicObject,它允許您以完全通用的方式獲取/設置實例的屬性。通過DynamicObjects,您可以獲得在設置或獲取屬性時調用的鉤子,這可以使您(例如)爲給定的動態屬性引發NotifyPropertyChange事件。