我有一个包含一个窗口的WPF应用程序。只有抛出这个窗口,用户才能在应用程序中执行他的导航。
应用程序结构是:
MainWindow.xaml
<Grid>
<ContentControl Content="{Binding CurrentWorkspace}" x:Name="ContentControlMainWindow" VerticalAlignment="Stretch"/>
</Grid>MainWindowViewModel.cs
private ContentControl _currentWorkspace;
public ContentControl CurrentWorkspace
{
get => _currentWorkspace;
set => SetProperty(ref _currentWorkspace, value);
}
//c'tor
public MainWindowViewModel()
{
CurrentWorkspace.Content = new ContentControl { Content = new StartPage()
}如您所见,在应用程序初始化时,我将StartPage视图加载到CurrentWorkspace。现在,从StartPageViewModel中,我需要将CurrentWorkspace内容更改为另一个视图。基本上,我很难从应用程序的每个部分控制(并更改)这个CurrentWorkspace。
发布于 2017-12-17 01:01:42
我喜欢这种方法:
在MainWindowViewModel.cs中:
// You would more likely type this as something like ViewModelBase/ObservableObject/etc.
private object _currentWorkspace;
public object CurrentWorkspace
{
get => _currentWorkspace;
set => SetProperty(ref _currentWorkspace, value);
}
private StartPageViewModel _startPageViewModel;
public StartPageViewModel StartPageViewModel
{
get => _startPageViewModel;
set => SetProperty(ref _startPageViewModel, value);
}
private AnotherPageViewModel _anotherPageViewModel;
public AnotherPageViewModel AnotherPageViewModel
{
get => _anotherPageViewModel;
set => SetProperty(ref _anotherPageViewModel, value);
}
public MainWindowViewModel()
{
StartPageViewModel = new StartPageViewModel();
AnotherPageViewModel = new AnotherPageViewModel();
CurrentWorkspace = StartPageViewModel;
}
// Navigation Method
private void NavigateToStartPage()
{
if (CurrentWorkspace != StartPageViewModel)
CurrentWorkspace = StartPageViewModel;
}
// Navigation Method
private void NavigateToAnotherPage()
{
if (CurrentWorkspace != AnotherPageViewModel)
CurrentWorkspace = AnotherPageViewModel;
}在MainWindow.xaml中:
<Window ...
xmlns:vm="clr-namespace:App.ViewModels"
xmlns:vw="clr-namespace:App.Views"
... >
<Window.DataContext>
<vm:MainWindowViewModel />
</Window.DataContext>
<Grid>
<ContentControl x:Name="ContentControlMainWindow"
Content="{Binding CurrentWorkspace}"
VerticalAlignment="Stretch">
<ContentControl.Resources>
<DataTemplate x:Key="start_page_view"
DataType="{x:Type vm:StartPageViewModel}">
<vw:StartPage />
</DataTemplate>
<DataTemplate x:Key="another_page_view"
DataType="{x:Type vm:AnotherPageViewModel}">
<vw:AnotherPage />
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
</Grid>
</Window/>然后,您可以将CurrentWorkspace设置为任何您想要的。例如,如果您想要释放StartPageViewModel的实例,可以只设置StartPageViewModel = null;。
通常认为在您的ContentControl中包含UI元素(例如,ViewModels )违反了MVVM。
https://stackoverflow.com/questions/47845124
复制相似问题