从另一个ViewModel

时间:2016-09-01 09:59:41

标签: c# wpf mvvm

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

我有一个包含UserControl(Control1)的Window,而UserControl包含另一个UserControl(Control2)。我选择这种方式而不是使用对话窗口(Control2充当对话窗口)。

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

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

这是带有Control1的MainWindow:

enter image description here

这是Control2超过Control1

enter image description here

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

这是Control2上设置Control1的方式:

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

Control2中显示GridControl2Visibility并将Visible设为Control1VM

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

            RaisePropertyChangedEvent("GridControl2Visibility");
        }
    }
}

当我点击Control2中的确定或取消按钮时,如何隐藏Control2?我的问题是GridControl2Visibility位于Control1VM,我无法从Control2VM访问该类。

2 个答案:

答案 0 :(得分:1)

使用两个视图模型都可以访问的服务,并存储Control2是否应该可见的信息。理想情况下,服务将使用您的di-container注册为singleton并注入视图模型。

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

答案 1 :(得分:0)

您可以使用事件,您可以从Control2VM引发事件并将其置于Control1VM中并将GridControl2Visibility设置为false。