有没有办法从WPF中的ViewModel关闭Usercontrol

时间:2019-03-04 15:25:20

标签: c# wpf mvvm

我正在研究使用MVVM模式开发的WPF应用程序。 MainWindow具有几个执行操作时打开的用户控件。但是,我要在完成操作并单击按钮后关闭Usercontrol。我到过几个地方看过,但是到目前为止还没有运气。任何帮助将不胜感激。

有人指出,我的问题是这个问题的重复:

Close View from ViewModel

但实际上并非如此,因为该线程谈论关闭窗口,所以我的意思是关闭UserControl。

添加一些代码使其清晰:

这是第一个用户控件中的ItemsControl,它承载着第二个用户控件:

<Grid x:Name="UserControlGrid"  Width="Auto" Height="auto" Margin="0,0,0,0">
            <ItemsControl ItemsSource="{Binding ViewsToShow}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <Grid IsItemsHost="True" Width="auto" Height="auto"></Grid>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>
        </Grid>

现在打开第一个UserControl ViewModel中的第二个UserControl,我这样做:

    private ObservableCollection<ObservableObject> viewsToShow = new ObservableCollection<ObservableObject>();
            public ObservableCollection<ObservableObject> ViewsToShow
            {
                get
                {
                    return viewsToShow;
                }
                set
                {
                    viewsToShow = value;
                    OnPropertyChanged("ViewsToShow");
                }
            }

     ViewsToShow.Add(new SecondUserControlViewModel());

谢谢

1 个答案:

答案 0 :(得分:1)

答案是:您不应关闭用户控件(除非它们用作单独的对话框,根据上面的评论,这不是您的情况)。

用户控件可见性的所有更改均与导航有关。在逻辑上导航到涉及另一个用户控件的功能后,您必须隐藏旧的控件并显示新的控件。通常,这是通过模板选择来完成的:

两个模板,每个用户控件一个,每个模板分别与各自的ViewModel相关联:

<DataTemplate DataType="{x:Type ViewModels:FirstViewModel}">
    <controls:FirstControl />
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModel:SecondViewModel}">
    <controls:SecondControl />
</DataTemplate>

然后,我们声明一个占位符:

<ContentControl Content="{Binding ViewModelSelector}" />

一旦ViewModelSelector属性返回FirstViewModel,我们的占位符将显示FirstControl。如果将ViewModelSelector属性导航到SecondViewModel,则占位符将自动用FirstControl替换SecondControl,反之亦然。