我有一个树视图,该树视图与一些自定义视图模型绑定在一起。视图模型位于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>
属性窗口也显示了一个对象,但我不知道为什么:
有什么想法吗?
答案 0 :(得分:1)
我认为它希望您使用接口类型而不是类类型。
因此,如果您定义一个接口 ICorrectionAndFreqViewModel
来公开您将用于数据绑定的所有属性,然后让 CorrectionAndFreqViewModel
实现该接口,那么您应该会很好。
就像你说的,这里的代码仍然可以编译和运行,而不使用这里的接口。我猜测设计者为什么会抱怨这个问题是数据绑定只能用于 public
属性,因此通过使用接口,可以保证所有属性都是 public
。
答案 1 :(得分:0)
在属性中,将“ DataType”设置为您实际的视图模型类型(例如您的案例中的CorrectionAndFreqViewModel),而不是“对象”。
希望这可以解决问题。
如果满意,请标记为答案。
理想情况下,它应该自动在属性中选择正确的数据类型,就我而言,它可以正常工作。
答案 2 :(得分:0)
您应该有一个像local
,l
之类的xmlns标记。在数据类型中,您需要使用local:CorrectionAndFreqViewModel
而不是{x:Type CorrectionAndFreqViewModel}
。如果您没有这些xmlns值之一,则需要对其进行定义,以使其指向您正在使用的dll(如果您正在查看其他项目,例如xmlns:msl="clr-namespace:MediaSystems"
,则可以使用其他标记)