WPF设计器DataTemplate.DataType不能为类型对象

时间:2018-08-02 03:56:48

标签: c# wpf designer

我有一个树视图,该树视图与一些自定义视图模型绑定在一起。视图模型位于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>

属性窗口也显示了一个对象,但我不知道为什么:

enter image description here

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

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

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

就像你说的,这里的代码仍然可以编译和运行,而不使用这里的接口。我猜测设计者为什么会抱怨这个问题是数据绑定只能用于 public 属性,因此通过使用接口,可以保证所有属性都是 public

答案 1 :(得分:0)

在属性中,将“ DataType”设置为您实际的视图模型类型(例如您的案例中的CorrectionAndFreqViewModel),而不是“对象”。

希望这可以解决问题。

如果满意,请标记为答案。

理想情况下,它应该自动在属性中选择正确的数据类型,就我而言,它可以正常工作。

答案 2 :(得分:0)

您应该有一个像locall之类的xmlns标记。在数据类型中,您需要使用local:CorrectionAndFreqViewModel而不是{x:Type CorrectionAndFreqViewModel}。如果您没有这些xmlns值之一,则需要对其进行定义,以使其指向您正在使用的dll(如果您正在查看其他项目,例如xmlns:msl="clr-namespace:MediaSystems",则可以使用其他标记)