C#MVVM TreeView分层数据的双向绑定
我在谷歌上搜索了两个多星期的答案。这通常意味着要么我是瞎子,要么这个想法是荒谬的。无论如何: 在一个中等规模、非常灵活的项目中,我将配置数据存储在一个层次结构中,如下所示:C#MVVM TreeView分层数据的双向绑定,c#,mvvm,treeview,hierarchical,two-way-binding,C#,Mvvm,Treeview,Hierarchical,Two Way Binding,我在谷歌上搜索了两个多星期的答案。这通常意味着要么我是瞎子,要么这个想法是荒谬的。无论如何: 在一个中等规模、非常灵活的项目中,我将配置数据存储在一个层次结构中,如下所示: 配置(集合) 音频(类) BaseDir(结构) 播放模式(枚举) 输入(类) 校准连接(bool) 知识设备(收集) 。。。(班级) UseDevice(整数) 播放列表(收藏) 第一音频(类) 路径(字符串) 重复(整数) 我已经设法以MVVM模式在树状视图中显示了这些。由于我无法准确地判断将来
- 配置(集合)
- 音频(类)
- BaseDir(结构)
- 播放模式(枚举)
- 输入(类)
- 校准连接(bool)
- 知识设备(收集)
- 。。。(班级)
- UseDevice(整数)
- 播放列表(收藏)
- 第一音频(类)
- 路径(字符串)
- 重复(整数)
类
、ienumerable
、我的自定义结构和基本值类型(字符串
、bool
、枚举
、…)创建视图模型
在我的XAML中,它们有相应的(分层)数据模板,例如,带有布尔值的复选框或常规值类型的文本块
每个ViewModel实例都有一个字段来存储基础模型的数据
我可以在视图中编辑这些值,也可以在ViewModel中通过双向绑定编辑这些值。
但让我头疼的是如何在模型中更新这些数据。
由于我是通过反射创建层次化ViewModel结构的,所以父对象没有与字段名/索引器/对应的get/set属性。。。等效配置类/集合的。尽管每个ViewModel实例都知道父模型数据结构的字段/属性名称,但它是从中创建的,并且也知道其父ViewModel实例(但不知道其父模型实例)。
每次试图通过命令或调用某个家长的更新函数来解决这个问题,都会让我的大脑产生一个结
难道没有一种简单的方法可以通过常规绑定技术实现这一点吗?
如果我为正在使用的每个配置(子)类创建ViewModels会更好吗?
提示:每个ViewModel实例都知道其父模型数据结构中的字段/属性名称。通过阅读注释,我认为视图模型应该与其试图表示的模型紧密耦合。拥有动态视图模型也很难测试
但是,如果你真的想绕过这个问题,可以考虑使用一个允许以完全通用的方式获取/设置实例上的属性的方法。使用DynamicObjects,您将获得在设置或获取属性时调用的钩子,这将使您(例如)能够为给定的动态属性引发NotifyPropertyChange事件。
通过为string
、bool
、enum
、ienumerable
等创建视图模型,您获得了什么。?为什么不直接绑定到这些?如果视图模型不知道如何操作模型,那么我根本不认为它是视图模型。因为类的ViewModel不知道它包含的确切字段,所以任何类的TrieViewitm包含每个字段和参数的子项,它本身可能是一个类。从C++中思考,我会使用一些引用来存储一个“指针”到字段(在特定的VIEW模型的构造函数调用中访问)。现在我明白了,没有一个“一般视图模型”,我认为它是令人伤心的。相反,对于存在的任何模型类,必须有特定的ViewModel和特定的视图。