【问题标题】:Access a ViewModel from another ViewModel从另一个 ViewModel 访问一个 ViewModel
【发布时间】:2016-09-01 18:26:04
【问题描述】:

我正在使用 MVVM 模式、C# 和 .NET Framework 4.6.1 开发 WPF。

我有一个包含 UserControl (Control1) 的窗口,并且该 UserControl 包含另一个 UserControl (Control2)。我选择了这种方式来代替使用对话窗口(@98​​7654327@ 充当对话窗口)。

两个用户控件都有一个 Viewmodel(Control1VMControl2VM)。

我使用Control2 作为表单让用户输入一些我需要启动应用程序的数据。

这是带有Control1的主窗口:

这是Control2 超过Control1

我的问题是当我点击确定或取消按钮时,我不知道如何隐藏Control2

这是在Control1 上设置Control2 的方式:

<Grid x:Name="gridControl2" Margin="30" Grid.RowSpan="6" Grid.ColumnSpan="3" Visibility="{Binding GridControl2Visibility}">
    <local:Control2 x:Name="userControlControl2" />
</Grid>

Control1VM中显示Control2并将GridControl2Visibility设置为Visible

public Visibility GridControl2Visibility
{
    get { return gridControl2Visibility; }
    set
    {
        if (gridControl2Visibility != value)
        {
            gridControl2Visibility = value;

            RaisePropertyChangedEvent("GridControl2Visibility");
        }
    }
}

当我单击Control2 中的确定或取消按钮时,如何隐藏Control2?我的问题是GridControl2VisibilityControl1VM 上,我无法从Control2VM 访问该类。

【问题讨论】:

  • 常用的方法是使用 MVVM 工具包的消息传递功能。
  • 也为窗口创建一个虚拟机,并在其中保留子虚拟机的实例。子 VM 将依次由其子 VM 实例组成。这样,您可以从 Window VM 控制整个代码。

标签: c# wpf mvvm


【解决方案1】:

使用两个视图模型都可以访问的服务,并存储Control2 是否应该可见的信息。理想情况下,该服务将在您的双容器中注册为单例并注入到视图模型中。

或者,您可以使用事件聚合器,它基本上也是一个单例服务,但专注于分发事件而不是保持状态。

【讨论】:

【解决方案2】:

您可以使用事件,您可以从 Control2VM 引发事件并在 Control1VM 中处理它并将 GridControl2Visibility 设置为 false。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    相关资源
    最近更新 更多