Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#MVVM TreeView分层数据的双向绑定_C#_Mvvm_Treeview_Hierarchical_Two Way Binding - Fatal编程技术网

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(整数)
    • 播放列表(收藏)
    • 第一音频(类)
      • 路径(字符串)
      • 重复(整数)
我已经设法以MVVM模式在树状视图中显示了这些。由于我无法准确地判断将来将添加哪些选项,因此我使用了一种通用方法,为
ienumerable
、我的自定义
结构和基本值类型(
字符串
bool
枚举
、…)创建视图模型

在我的XAML中,它们有相应的(分层)数据模板,例如,带有布尔值的复选框或常规值类型的文本块

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

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

难道没有一种简单的方法可以通过常规绑定技术实现这一点吗?
如果我为正在使用的每个配置(子)类创建ViewModels会更好吗?

提示:每个ViewModel实例都知道其父模型数据结构中的字段/属性名称。

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


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

通过为
string
bool
enum
ienumerable
等创建视图模型,您获得了什么。?为什么不直接绑定到这些?如果视图模型不知道如何操作模型,那么我根本不认为它是视图模型。因为类的ViewModel不知道它包含的确切字段,所以任何类的TrieViewitm包含每个字段和参数的子项,它本身可能是一个类。从C++中思考,我会使用一些引用来存储一个“指针”到字段(在特定的VIEW模型的构造函数调用中访问)。现在我明白了,没有一个“一般视图模型”,我认为它是令人伤心的。相反,对于存在的任何模型类,必须有特定的ViewModel和特定的视图。