在WPF中切换用户控件仅显示ViewModel的名称

问题描述 投票:0回答:1

我已经使用MVVM设计和一些简单的导航功能构建了WPF应用。我在项目中添加了两个Views(用户控件)和虚拟ViewModels(空类)以通过此导航切换它们。这是我的文件夹结构:Folder Structure

因此,当我单击导航按钮中第一个按钮而不是用户控件视图时,我得到了ViewModel的名称,如下所示:App screen(View.ViewModels.ViewModel的名称)

这是我的实现方式:

Window.Resources with DataTemplate

Navi buttons for switching user controls

MainWindow.xaml.cs:

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new NavigationViewModel();
    }

用于切换的NavigationViewModel:

class NavigationViewModel : INotifyPropertyChanged
{
    public ICommand CurrencyCommand { get; set; }
    public ICommand GoldCommand { get; set; }
    private object selectedViewModel;
    public object SelectedViewModel
    {
        get { return selectedViewModel; }
        set { selectedViewModel = value; OnPropertyChanged("SelectedViewModel"); }
    }

    public NavigationViewModel()
    {
        CurrencyCommand = new BaseCommand(OpenCurrency);
        GoldCommand = new BaseCommand(OpenGold);
    }

    public void OpenCurrency(object obj)
    {
        SelectedViewModel = new CurrencyViewModel();
    }

    public void OpenGold(object obj)
    {
        SelectedViewModel = new GoldViewModel();
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propName)

    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propName));
        }

    }
}

BaseCommand类仅实现ICommand接口。

用于显示用户控件的XAML:

<ContentControl Margin="45, 50, 0, 0" Content="{Binding SelectedViewModel}"/>

有人知道为什么会这样吗?我是从教程中完成此操作的:Tutorial link,在本教程的情况下一切正常,但在我的项目中却没有。

c# wpf mvvm user-controls
1个回答
0
投票

来自链接的教程:

创建类型为EmployeeViewModel的DataTemplate,并且其中应包含EmployeeView UserControl。 重要的是,您应该指定DataTemplates的任何键,因为这些DataTemplates将通过其DataType进行查询。

不应为视图模型的DataTemplates指定x:Key。仅当没有x:Key

时,DataType才能选择DataTemplates
<DataTemplate DataType="{x:Type vm:CurrencyViewModel}">
    <vs:CurrencyControl/>
</DataTemplate>
© www.soinside.com 2019 - 2024. All rights reserved.