【问题标题】:WPF Designer DataTemplate.DataType cannot be type objectWPF 设计器 DataTemplate.DataType 不能是类型对象
【发布时间】:2019-01-09 17:33:59
【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

  • 您找到解决方案了吗?我遇到了同样的问题并且很难过。它不会影响功能,但肯定会影响我的工作效率,因为我坐在这里试图弄清楚为什么我在成功构建时会出错。哈哈
  • @RickRiensche 不幸的是,我只是在处理无法正确使用设计器的问题:(
  • 我已经在 Visual Studio 2019 社区版本 16.3.6 中运行了你的代码,它工作得很好......
  • Visual Studio 2019 社区版本 16.4.0 中似乎仍然存在此错误 :(
  • 我没有遇到你在VS2019 WPF项目(.NET Framework)中提到的任何问题。你的WPF项目是.NET Core吗?

标签: c# wpf designer


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我可以通过确保文件名与类名完全相同来解决此问题。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 在没有 x:Type 的情况下编写类型“local:CorrectionAndFreqViewModel”对我有用。
      【解决方案4】:

      我遇到了同样的问题。要修复,请执行以下操作:

      1. 成功构建和重建项目。
      2. 转到Tool > Option > XAML > 取消选中Automaticaly name interactive...
      3. 重启Visual Studio,问题就消失了。

      【讨论】:

        【解决方案5】:

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

        希望这能解决问题。

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

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

        【讨论】:

        • 它不让我。输入CorrectionAndFreqViewModel 告诉我它无法解析字符串。输入 {x:type CorrectionAndFreqViewModel} 只是恢复为 Object。
        猜你喜欢
        • 1970-01-01
        • 2013-10-18
        • 1970-01-01
        • 1970-01-01
        • 2014-05-01
        • 2010-12-11
        • 2016-05-14
        • 2012-04-22
        相关资源
        最近更新 更多