视图模型中的页面导航

时间:2018-12-10 08:31:06

标签: c# wpf mvvm

我想从ViewModel实现页面导航。 如您在代码中所见,在主窗口中有一个必须填充页面的框架。

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition MaxWidth = "175" ></ColumnDefinition>
        <ColumnDefinition Width="*"></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Grid Grid.Column="1">
        <Frame Background = "Gray" NavigationUIVisibility= "Hidden" Name = "mainFrame" Margin= "0,0,5,0" >
        </Frame>
    </Grid>
</Grid >

在MainWindowViewModel中,我实现了必须通过单击按钮“转到下一页”执行的命令方法。此方法称为“ ExecuteOpenTestResultsRecoveryPage”

private void ExecuteOpenTestResultsRecoveryPage(object parameter)
{
    RecoveryPage recoveryPage = new RecoveryPage();
    MainWindow mainWindow = new MainWindow();
    mainWindow.mainFrame.NavigationService.Navigate(recoveryPage);
}

通过单击“转到下一页”按钮,将执行该方法,但是框架中没有任何反应,我也不知道为什么。请您能帮助我实现它吗?

谢谢!

3 个答案:

答案 0 :(得分:0)

我不建议您在要显示新页面时打开新的MainWindow。最好向视图发送一条消息以显示特定的其他视图。这样,您就可以实现关注点分离。

答案 1 :(得分:0)

您正在编辑new MainWindow()的{​​{1}}的内容。不是您当前的那个。

mainFrame

尝试一下。

答案 2 :(得分:0)

您正在实例化mainwindow的另一个实例。 这只是在内存中。 然后,将其框架的内容设置为用户控件。 但是您永远不会显示这个新的主窗口。

您可以参考现有的主窗口,例如:  var theMainWindow = Application.Current.MainWindow作为MainWindow。 然后在其上设置框架的内容。 但这通常被认为是不好的做法。

我建议您首先使用google viewmodel。 工作方式是为每个要导航的对象定义一个视图模型。 使用datatype =将UserControl(而非页面)与每个用户控件相关联。这在您在app.xaml中合并的资源字典中。 然后在主窗口中使用contentcontrol(而不是frame)来托管这些控件。 从主窗口视图模型中公开一个公共属性CurrentViewModel并将内容控件的内容绑定到该控件。将该属性更改为另一个视图模型,然后将其模板化到关联的用户控件中。

这是一个标准模式,您应该可以很容易地找到样本。