我正在研究使用MVVM模式开发的WPF应用程序。 MainWindow具有几个执行操作时打开的用户控件。但是,我要在完成操作并单击按钮后关闭Usercontrol。我到过几个地方看过,但是到目前为止还没有运气。任何帮助将不胜感激。
有人指出,我的问题是这个问题的重复:
但实际上并非如此,因为该线程谈论关闭窗口,所以我的意思是关闭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());
谢谢
答案 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
,反之亦然。