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

本文关键字:方法 调用 模型 视图 MVVM WPF | 更新日期: 2023-09-27 18:31:10

我正在 WPF-MVVM 中处理一个项目,其中我有一个主窗口,其中包含一个带有两个选项卡的选项卡控件。这些选项卡中的每一个都有一个按钮。

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

让选项卡的视图模型要求主视图模型执行此操作的正确方法是什么?

应用程序截图

帕斯特宾上的代码

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

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

您可以使用如下所示

的相对绑定来访问父级 DataContext:

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

我不确定正确的方法,但这里有两个选项浮现在脑海中,对我来说似乎很合适:)

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

第二个是将事件添加到子视图模型,

并在添加/删除子视图模型时在父视图模型中订阅/取消订阅该事件(类似于第一个选项,仅使用事件,而不是属性)。然后从事件处理程序中,您可以调用所需的方法

第一个选项是更直接地回答您的问题(从孩子调用父母的方法)。第二种选择更通用,孩子不必知道父级,您可以订阅来自其他类型的父级或任何您想要的事件。

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