数据模板不设置数据上下文WPF

ifmq2ha2  于 2023-11-21  发布在  其他
关注(0)|答案(1)|浏览(173)

我正在使用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?

72qzrwbm

72qzrwbm1#

为了自动选择,DataTemplate必须声明为XAML资源,例如在Window.Resources中。
它的DataType属性必须由x:Type标记扩展设置,简单的类型名称字符串将不起作用。
您还可以使用ContentControl为特定的内容类型应用DataTemplate

<Window ...>
    <Window.Resources>
        <DataTemplate DataType="{x:Type viewmodels:OptionsVM}">
            <views:Options/>
        </DataTemplate>
    </Window.Resources>
    <ContentControl Content="{Binding SelectedViewModel}"/>
</Window>

字符串
还必须确保Options控件没有显式设置自己的DataContext。
在视图模型中,必须使用属性的名称(而不是其支持字段的名称)来通知属性更改:

OnPropertyChanged(nameof(SelectedViewModel));

相关问题