Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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 MVVM中的ViewModel是否应该引用该视图?_Wpf_Design Patterns_Mvvm - Fatal编程技术网

Wpf MVVM中的ViewModel是否应该引用该视图?

Wpf MVVM中的ViewModel是否应该引用该视图?,wpf,design-patterns,mvvm,Wpf,Design Patterns,Mvvm,在MVVM(模型-视图-视图-模型)模式中,视图模型应该引用视图。我认为不应该。但如何应对以下情况?我有一个视图,其中有一个选项卡控件作为主容器,该视图的viewmodel实现了一个命令,用于向选项卡控件添加一个新选项卡。简单的方法是允许viewmodel引用视图,然后在命令实现中以编程方式将新选项卡添加到视图中的tabcontrol中。这似乎是错误的。我是否应该以某种方式将tabcontrol绑定到viewmodel,然后实现一个数据/控件模板来添加新的选项卡。我希望这对某些人来说是有意义的:

在MVVM(模型-视图-视图-模型)模式中,视图模型应该引用视图。我认为不应该。但如何应对以下情况?我有一个视图,其中有一个选项卡控件作为主容器,该视图的viewmodel实现了一个命令,用于向选项卡控件添加一个新选项卡。简单的方法是允许viewmodel引用视图,然后在命令实现中以编程方式将新选项卡添加到视图中的tabcontrol中。这似乎是错误的。我是否应该以某种方式将tabcontrol绑定到viewmodel,然后实现一个数据/控件模板来添加新的选项卡。我希望这对某些人来说是有意义的:)

我发现在视图上公开一个处理视图特定功能的接口通常是一种有益的折衷。这是处理纯绑定难以完成的事情的一种好方法,例如指示表单关闭、打开文件对话框(尽管这通常放在它自己的服务接口中)或与不适合数据绑定的控件交互(例如您提供的示例)

使用接口仍然可以使视图和ViewModel在很大程度上保持解耦,并使您能够在测试期间模拟特定的IView。

在“纯”MVVM中,ViewModel不应该真正引用视图。然而,在视图中提供某种形式的界面通常是很方便的,这样ViewModel就可以与之交互

然而,我发现我几乎再也不这样做了。另一种方法是在视图中使用某种形式的行为或混合行为,并将其绑定到ViewModel属性。这允许您将视图逻辑100%保留在视图中。此外,通过为此创建一个行为,您可以创建一个可重用类型,该类型可用于在每个ViewModel->View交互中处理此问题。与ViewModel中的任何视图逻辑相比,我更喜欢这种方法


为了演示这项技术,我为表达式代码库编写了一个名为的示例。它演示了如何使用绑定到ViewModel中属性的视图中的行为来控制窗口的生命周期,包括防止窗口关闭等。

Reed和Dan介绍了一般方法,但参考了您的具体情况,TabControl是一个ItemsControl,因此可以将其ItemsSource绑定到ViewModel中表示要显示的选项卡集的数据集合。然后,每种选项卡类型的UI都可以由特定于项的数据类型的DataTemplate表示(使用DataType或DataTemplateSelector)。然后,您可以根据需要从您的虚拟机中添加或删除数据项,并让虚拟机自动更新选项卡,而不让虚拟机知道任何关于选项卡控件的信息。

我们中的一个人缺少一些明显的信息。选项卡控件是ItemsControl。您应该将选项卡控件的ItemsSource绑定到视图模型中的ovservable集合。当您在视图模型中处理添加选项卡的命令时,您只需向该集合添加一个新元素,瞧,您已经向控件添加了一个新选项卡。

所有其他答案都很好。这只是我想做的事情。我甚至找到了在视图模型中设置所选项的方法,而无需通过绑定到集合中最后添加的模型的VM上的属性引用视图。非常整洁。。。