C#MVVM TreeView TwoWay-Bounding的分层数据

时间:2010-07-15 16:24:53

标签: c# mvvm treeview hierarchical two-way-binding

我用Google搜索了两个多星期的答案。这通常意味着我是盲人或者这个想法是荒谬的。反正:

在一个中等规模,非常灵活的项目中,我将配置数据存储在这个类似的层次结构中:

  • 配置(收藏)
    1. 音频(课程)
      • BaseDir(struct)
      • PlayMode(enum)
      • 输入(类)
      • CalibrateOnConnect(bool)
      • KnownDevices(收藏)
        1. ......(上课)
          • ...
      • UseDevice(整数)
      • 播放列表(收藏)
        1. FirstAudio(班级)
          • 路径(字符串)
          • 重复(整数)
      • ...

我已经设法在MVVM模式的TreeView中显示它们。由于我无法确切知道将来会添加哪些选项,因此我使用了通用方法,为class创建ViewModel,ienumerable,我的自定义structs和基本值类型({ {1}},stringbool,...)。

在我的XAML中,它们具有相应的(Hierarchical)DataTemplates,例如使用CheckBox for booleans或textblock for general value types。

每个ViewModel实例都有一个字段来存储基础模型的数据。

我设法在View中编辑这些值,并通过ViewWodel中的TwoWay-Binding编辑 但令我头疼的是如何在模型中更新这些数据 由于我通过反射创建了分层ViewModel结构,因此父项没有与等效配置类/集合的字段名称/索引器/ ...对应的get / set属性。虽然每个ViewModel实例都知道父模型的数据结构的字段/属性名称,但它也是从父ViewModel实例创建的,但也知道它的父模型实例。 每次尝试通过命令解决这个问题或通过调用一些父级的更新功能都会在我的大脑中形成一个结。

通过常规绑定技术是不是有一种简单的方法来实现这一点? 如果我为每个正在使用的配置(子)类创建ViewModel会更好吗? 提示:每个ViewModel实例都知道父模型的数据结构中的字段/属性名称。

1 个答案:

答案 0 :(得分:1)

通过评论阅读我认为视图模型应该与它试图表示的模型紧密耦合。拥有动态视图模型也很难测试。

但是,如果您真的想尝试解决这个问题,可以考虑使用DynamicObject,它允许您以完全通用的方式获取/设置实例的属性。使用DynamicObjects,您将获得在设置或获取属性时调用的钩子,这将使您(例如)能够为给定的动态属性引发NotifyPropertyChange事件。