我已经使用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,在本教程的情况下一切正常,但在我的项目中却没有。
来自链接的教程:
创建类型为EmployeeViewModel的DataTemplate,并且其中应包含EmployeeView UserControl。 重要的是,您应该指定DataTemplates的任何键,因为这些DataTemplates将通过其DataType进行查询。
您不应为视图模型的DataTemplates指定x:Key
。仅当没有x:Key
<DataTemplate DataType="{x:Type vm:CurrencyViewModel}">
<vs:CurrencyControl/>
</DataTemplate>