【问题标题】:MVVM WPF navigating views from inside the viewsMVVM WPF 从视图内部导航视图
【发布时间】:2023-04-08 15:29:02
【问题描述】:

我已经被这个问题困扰了几个小时了。我遵循了这个似乎是最相关(无框架)WPF MVVM navigate views 的答案,但我遗漏了一些东西并且它不起作用。它只在屏幕上显示 .toString 方法,而不是实际的数据模板。

我拥有的是 MainWindow.xamlView1.xamlView2.xaml 以及相关的 ViewModel。两个视图都有可以转到另一个视图的按钮。为什么 ContentControl 只显示 .toString()?

MainWindow.xaml

<Window.Resources>
    <DataTemplate x:Key="View1Template" DataType="{x:Type viewmodels:View1Model}">
        <views:View1 />
    </DataTemplate>
    <DataTemplate x:Key="View2Template" DataType="{x:Type viewmodels:View2Model}">
        <views:View2 />
    </DataTemplate>
</Window.Resources>

<Grid>
    <ContentControl Content="{Binding CurrentView}" />
</Grid>

MainWindowViewModel.cs

public class MainWindowViewModel : ViewModelBase
{

    private ViewModelBase currentView;

    public ViewModelBase CurrentView
    {
        get
        {
            return currentView;
        }
        set
        {
            if (currentView != value)
            {
                currentView = value;
                OnPropertyChanged("CurrentView");
            }
        }
    }

    public MainWindowViewModel ()
    {
        CurrentView = new View1Model();
    }

}

我应该如何进行这项工作?此外,交换视图的命令应该在哪里?在这个MainWindowViewModel.cs?

DataContext 在代码隐藏中设置。

【问题讨论】:

  • 从 DataTemplates 中删除 x:Key="..."。如果未命名,则根据 DataType 提取它们。链接示例没有x:Key。还链接的示例说明了 view model 中的 ICommand
  • 这可能对你有帮助:stackoverflow.com/a/6114865/885920
  • 你能写下这部分 x:key 作为答案吗?它解决了主要问题

标签: c# wpf xaml mvvm


【解决方案1】:

为了使示例工作从 DataTemplates 中删除 x:Key="..."


ContentControl 绑定到 CurrentView。 CurrentView 是一个视图模型实例,没有可视化表示(不是从框架Visual 类派生的)。

没有ContentTemplate,因此ContentControl 尝试为View1Model(或View2Model)类型查找默认DataTemplate。但是在 Resources 中声明的两个 DataTemplate 都不是默认的,它们以x:Key 命名。所以 ContentControl 什么也没有找到并回退到有保证的方法:显示 Content 的字符串表示,因为每个 .NET 对象都有 ToString() 方法。

【讨论】:

    猜你喜欢
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多