Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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
Wpf ViewModel树与频繁更新模型树_Wpf_Mvvm_Real Time - Fatal编程技术网

Wpf ViewModel树与频繁更新模型树

Wpf ViewModel树与频繁更新模型树,wpf,mvvm,real-time,Wpf,Mvvm,Real Time,在我的WPF MVVM应用程序中,我的模型是一个复杂的模型对象树,在运行时不断变化。模型实例在运行时来来去去去,改变它们在树中的位置,当然也改变它们的许多属性。我的视图几乎是那棵树的一对一视觉表示。80%的情况下,每个模型实例都是树中的一个节点 我现在的问题是如何围绕这个设计ViewModel?我的问题是有很多不同的模型类型,每种类型都有很多属性。如果我正确理解了MVVM,那么视图不应该直接与模型通信,因此这意味着我必须为每个模型类型创建一个ViewModel类型,并且必须在ViewModel中

在我的WPF MVVM应用程序中,我的模型是一个复杂的模型对象树,在运行时不断变化。模型实例在运行时来来去去去,改变它们在树中的位置,当然也改变它们的许多属性。我的视图几乎是那棵树的一对一视觉表示。80%的情况下,每个模型实例都是树中的一个节点

我现在的问题是如何围绕这个设计ViewModel?我的问题是有很多不同的模型类型,每种类型都有很多属性。如果我正确理解了MVVM,那么视图不应该直接与模型通信,因此这意味着我必须为每个模型类型创建一个ViewModel类型,并且必须在ViewModel中重写模型类型的每个属性

此外,ViewModel还需要“绑定”到模型的propertychanges以将其传递给视图(使用wpf数据绑定)。我需要一些工厂,为每个新出现的模型创建并引入一个ViewModel实例,当相应的模型消失时,我必须处理每个ViewModel实例。我最终会跟踪我创建的所有实例。由于这种双重包装,生成了大量膨胀的代码,这是令人难以置信的。 这真的是一个好方法吗?每个实体和每个属性或多或少都存在两次,我有很多额外的代码来保持模型和视图的同步。你是怎么处理的?有没有更聪明的方法来解决这个问题


有没有人对此有一个比我做得更好的参考/示例实现?

我认为如果您遵循这条路径,您可能会陷入范例陷阱。MVVM不过是一种模式,它简化了WPF世界中的开发。如果没有-不要使用它或修改你的方法。我不会花80%的时间去检查“使用MVVM”字段

现在回到你的问题上来。如果我错了,请纠正我,但听起来您是从相反的方向看MVVM:您不需要ModelViewModel一对一的对应关系。通常先基于视图创建视图模型,然后才基于模型创建视图模型

通常,您可以查看图形设计人员提供的屏幕模型,并创建相应的ViewModel,它从模型中获取所有必要的字段,包装/修改/格式化/组合这些字段,以尽可能轻松地进行视图开发

您说过您的视图几乎是模型的一对一视觉表示。在这种情况下,可以创建一个非常简单的ViewModel,它公开模型树的根对象,并让View通过该属性直接使用模型。然后,如果需要一些视图自定义或命令处理,可以将其委托给ViewModel


很抱歉回答得很模糊。也许如果你问更具体的问题,我们可以消除困惑:)

+1非常透彻的回答和很好的建议,不要太字面化地采用范例。+1表示“通常您首先基于视图创建视图模型,然后才基于模型*”