我正在使用WPF和MVVM。我将主窗口的DataContext设置为NavigationViewModel(处理导航)。它看起来像这样:
public class NavigationVM : BaseVM
{
private BaseVM? selectedViewModel;
public NavigationVM()
{
var optionsVM = new OptionsVM(this);
SelectedViewModel = optionsVM;
}
public BaseVM SelectedViewModel
{
get { return selectedViewModel!; }
set
{
selectedViewModel = value;
OnPropertyChanged(nameof(selectedViewModel));
}
}
}
字符串
MainWindow.xaml
<Window.ContentTemplate>
<DataTemplate DataType="viewmodels:OptionsVM">
<views:Options></views:Options>
</DataTemplate>
</Window.ContentTemplate>
<UserControl Content="{Binding SelectedViewModel}"
HorizontalAlignment="Center"
VerticalAlignment ="Center"/>
型
这种导航方式很好用。
在NavigationVM的构造函数中,我将SelectedViewModel
设置为OptionsVM(),它可以工作。显示的视图是我的Option视图(它只是一个有5个按钮的用户控件)。
问题是,我认为每当创建OptionsVM并设置Options vew时,都会将Option的数据上下文设置为ViewModel:
<DataTemplate DataType="viewmodels:OptionsVM">
<views:Options></views:Options>
</DataTemplate>
型
但是,当试图将按钮的command属性绑定到ViewModel中的属性时,找不到这些属性,这意味着视图的数据上下文实际上没有设置为ViewModel。如何将视图的数据上下文设置为ViewModel?
1条答案
按热度按时间72qzrwbm1#
为了自动选择,DataTemplate必须声明为XAML资源,例如在
Window.Resources
中。它的
DataType
属性必须由x:Type
标记扩展设置,简单的类型名称字符串将不起作用。您还可以使用
ContentControl
为特定的内容类型应用DataTemplate
:字符串
还必须确保Options控件没有显式设置自己的DataContext。
在视图模型中,必须使用属性的名称(而不是其支持字段的名称)来通知属性更改:
型