【问题标题】:Page navigation from View Model视图模型的页面导航
【发布时间】:2018-12-10 08:31:05
【问题描述】:

我想从 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);
}

通过单击“转到下一页”按钮,该方法被执行,但框架中没有任何反应,我不明白为什么。请问您能帮我实现吗?

谢谢!

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

    您正在编辑new MainWindow()mainFrame 的内容。不是你现在的。

    (Application.Current.MainWindow as MainWindow).mainFrame.Content = recoveryPage;
    

    试试这个。

    【讨论】:

    • 感谢大家的建议。我能够解决问题
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      您可以获得对现有主窗口的引用,例如: var theMainWindow = Application.Current.MainWindow 作为 MainWindow。 然后在上面设置框架的内容。 不过,这通常被认为是不好的做法。

      我建议你先谷歌视图模型。 这样做的方式是您为要导航到的每个事物定义一个视图模型。 使用 datatype= 将 UserControl(不是页面)与每个关联。这会出现在您在 app.xaml 中合并的资源字典中。 然后在主窗口中使用内容控件(而不是框架)来托管这些内容。 从主窗口视图模型中公开一个公共属性 CurrentViewModel 并将您的内容控件的内容绑定到该属性。将该属性更改为不同的视图模型,然后将其模板化到关联的用户控件中。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-02
        • 2020-08-02
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        相关资源
        最近更新 更多