WPF MVVM:MainWindow导航

时间:2017-12-16 11:24:50

标签: c# wpf mvvm binding contentcontrol

我有一个包含一个窗口的WPF应用程序。只有抛出此窗口,用户才能在应用程序中执行导航。

申请结构是:

  • MainWindow.xaml
  • MainWindowViewModel.cs
  • StartPage.xaml
  • StartPageViewMode.cs
  • Systems.xaml
  • Systems.cs
  • 另一种观点和相关的观点模型。

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。

1 个答案:

答案 0 :(得分:0)

我喜欢这种方法:

在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;

在ViewModel中,通常认为在MVVM中违反了UI元素,例如ContentControl