首页 > 解决方案 > WPF 设计器 DataTemplate.DataType 不能是类型对象

问题描述

我有一个与一些自定义视图模型绑定的树视图。视图模型在一个ObservableCollection和继承ViewModelBase其中继承INotifyPropertyChanged

它编译并运行良好,但在设计器中我得到了错误:

“DataTemplate.DataType 不能是类型对象

参数名称:值"

我的 XAML 是:

<TreeView Grid.Row="1" ItemsSource="{Binding ResultsTree}" SelectedItemChanged="TreeView_OnSelectedItemChanged">
<TreeView.Resources>
    <HierarchicalDataTemplate DataType="{x:Type local:TreeViewItemViewModel}" ItemsSource="{Binding Path=Children}">
        <StackPanel Orientation="Horizontal">
            <CheckBox IsChecked="{Binding IsChecked}"/>
            <TextBlock Text="{Binding Text}"/>
        </StackPanel>
    </HierarchicalDataTemplate>
    
    
    <DataTemplate DataType="{x:Type local:CorrectionAndFreqViewModel}">
        <StackPanel Orientation="Horizontal" ToolTip="{Binding AmbientText}">
            <Rectangle Width="20" Height="5" Fill="{Binding LineColor, Converter={StaticResource ColorToSolidColorBrushValueConverter}}"></Rectangle>
            <CheckBox IsChecked="{Binding IsChecked}"/>
            <TextBlock Text="{Binding Text}"/>
        </StackPanel>
    </DataTemplate>
</TreeView.Resources>
</TreeView>

属性窗口也说它是一个对象,但我不知道为什么:

在此处输入图像描述

有任何想法吗?

标签: c#wpfdesigner

解决方案


我认为它希望您使用接口类型而不是类类型。

因此,如果您定义了一个接口,该接口ICorrectionAndFreqViewModel公开了您将用于数据绑定的所有属性,然后CorrectionAndFreqViewModel实现了该接口,那么您应该很好。

就像你说的那样,代码仍然可以在不使用接口的情况下编译和运行。我猜测为什么设计师抱怨这个是数据绑定只能用于public属性,所以通过使用接口,可以保证所有属性都是public.


推荐阅读