WPF MVVM - 在“父”视图模型中调用方法的正确方法

时间:2016-01-20 22:17:40

标签: c# wpf mvvm

我正在使用WPF-MVVM中的一个项目,我有一个主窗口,其中包含一个带有两个选项卡的Tab Control。每个选项卡上都有一个按钮。

在这个项目中,有3种不同的视图模型,一个用于主窗口,另一个用于每个选项卡。当按下其中一个按钮时,我希望“父”视图模型(主窗口的视图模型)执行某些操作,例如关闭应用程序。

使用选项卡的视图模型的正确方法是让主视图模型执行此操作?

Screenshot of Application

Code on Pastebin

注意:我没有使用任何类型的框架,例如MVVM Light或Prism。

2 个答案:

答案 0 :(得分:2)

您可以使用这样的相对绑定来访问父DataContext:

Binding="{Binding RelativeSource={RelativeSource FindAncestor, 
    AncestorType={x:Type Window}}, Path=DataContext.AllowItemCommand}"

答案 1 :(得分:0)

我不确定正确的方法但是这里有两个选项让我想起并且对我来说非常合适:)

一种方法是将MainWindowViewModel Parent {get;set;}属性添加到子模型,然后在主MainWindowViewModel中添加属性,以便在向Tabs集合中添加或删除子项时设置该属性(因为它是'{1}} ObservableCollection,您可以向它添加事件处理程序以确保设置Parent属性,无论子项如何添加到集合中)。 在Win Forms中使用类似的东西来维护窗口和控件之间的父/子关系。

第二个是向子ViewModel添加事件,并在添加/删除子项时在父ViewModel中订阅/取消订阅该事件(类似于第一个选项仅包含事件,而不是属性)。然后从事件处理程序,您可以调用您想要的方法

第一个选项是更直接地回答你的问题(从孩子那里调用父亲的方法)。 第二种选择更为一般,孩子不必知道父母,你可以订阅其他父母或任何你想要的事件。

哪个更合适取决于您对当前项目的需求。