代码之家  ›  专栏  ›  技术社区  ›  Martin Hennings

c mvvm treeview分层数据的双向绑定

  •  0
  • Martin Hennings  · 技术社区  · 16 年前

    我搜索了两个多星期才找到答案。这通常意味着要么我是瞎子,要么这个想法是荒谬的。不管怎样:

    在一个中等规模、相当灵活的项目中,我将配置数据存储在一个分层结构中,如下所示:

    • 配置(集合)
      1. 音频(类)
        • basedir(结构)
        • 播放模式(枚举)
        • 输入(类)
        • 校准连接(BOOL)
        • 知识设备(集合)
          1. …(班)
        • 使用设备(整数)
        • 播放列表(收藏)
          1. 第一音频(类)
            • 路径(字符串)
            • 重复(整数)

    我已经设法以mvvm模式在treeview中显示了这些内容。由于我不能确切地知道将来会添加哪些选项,所以我使用了一种通用方法,为 class , ienumerable 我的习惯 structs 基本价值类型( string , bool , enum ,……)

    在我的xaml中,它们有相应的(分层的)数据模板,例如,对于布尔值有一个复选框,对于常规值类型有一个文本块。

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

    我可以在视图中编辑这些值,也可以在viewmodel中通过双向绑定编辑这些值。
    但让我头疼的是如何在模型中更新这些数据。
    由于我是通过反射创建层次结构viewmodel结构的,因此父级没有与字段名/索引器/对应的get/set属性。等效配置类/集合的。尽管每个viewmodel实例都知道父模型的数据结构的字段/属性名,并且也知道其父viewmodel实例(但不知道其父模型实例)。
    每次试图通过命令或调用某个家长的更新函数来解决这个问题,我的大脑都会打一个结。

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

    1 回复  |  直到 8 年前
        1
  •  1
  •   The Senator    12 年前

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

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

    推荐文章