WPF设计器DataTemplate.DataType不能为object类型。

36
我有一个树形视图,我正在使用一些自定义的视图模型进行绑定。这些视图模型在ObservableCollection中,并继承了ViewModelBase,而ViewModelBase又继承了INotifyPropertyChanged。
它编译并运行正常,但在设计器中我得到了错误:
"DataTemplate.DataType不能是对象类型,参数名称:value"
我的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
你是否找到了解决方法?我也遇到了同样的问题,但却束手无策。虽然它并不会影响功能,但它确实会影响我的工作效率,因为我坐在这里试图弄清楚为什么成功构建后会出现错误。哈哈。 - Rick Riensche
很遗憾,我无法使用设计师,正在处理这个问题。@RickRiensche - Loocid
我已经在 Visual Studio 2019 Community 版本 16.3.6 中运行了你的代码,它完全正常运行... - OMR
2
这个 bug 在 Visual Studio 2019 社区版 16.4.0 中似乎仍然存在 :( - Alan Wayne
我在VS2019 WPF项目(.NET Framework)中没有遇到您提到的任何问题。您的WPF项目是.NET Core吗? - i code
6个回答

3
我能够通过在DataTemplate中添加x:Key来解决这个WPF设计师的问题。
<ResourceDictionary>
    <DataTemplate x:Key="ThisKeySolvesDesignersNullRef" 
                  DataType="viewmodels:MyViewModel">
        <views:MyView/>
    </DataTemplate>
</ResourceDictionary> 

我已经搜索了数月,因为它最终出现在不同的项目中,并且有时会出现和消失而没有明确的原因。 感谢SO上的帮助回答


2
我认为它希望您使用接口类型而不是类类型。
因此,如果您定义一个接口ICorrectionAndFreqViewModel,该接口公开了所有用于数据绑定的属性,然后让CorrectionAndFreqViewModel实现该接口,那么您就可以了。
像您所说的那样,在这里不使用接口代码仍将编译和运行。我猜设计师对此抱怨的原因是数据绑定只能用于public属性,因此通过使用接口,保证所有属性都是public。

1
你需要有一个像locall或类似的xmlns标签。在数据类型中,你需要使用local:CorrectionAndFreqViewModel而不是{x:Type CorrectionAndFreqViewModel}。如果你没有这些xmlns值之一,那么你需要定义它,以便它指向你正在使用的dll(或者如果你正在查看另一个项目,则使用不同的标记,例如xmlns:msl="clr-namespace:MediaSystems")。

在我的情况下,不使用x:Type编写“local: CorrectionAndFreqViewModel”类型即可解决问题。 - Shahin Dohan

1

我成功解决了这个问题,方法是确保文件名与类名完全一致。


0

我曾经遇到过同样的问题。要解决这个问题,请按照以下步骤操作:

  1. 成功构建和重建项目。
  2. 转到 工具 > 选项 > XAML > 取消选中 自动命名交互式...
  3. 重新启动 Visual Studio,然后问题就会消失。

-2

在属性中,将“对象”替换为实际视图模型类型(例如您的情况下的CorrectionAndFreqViewModel)并将“DataType”设置为该类型。

希望这能解决问题。

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

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


3
它不让我这么做。输入“CorrectionAndFreqViewModel”告诉我它无法解析字符串。输入“{x:type CorrectionAndFreqViewModel}”只会恢复为“对象”。 - Loocid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接