我有一个WPF自定义UserControl定义如下:
<UserControl x:Name="parent" [..]>
<UserControl.Resources>
<ResourceDictionary>
<ObjectDataProvider x:Key="StatusValues" MethodName="GetValues" ObjectType="{x:Type core:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="s:Status" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</ResourceDictionary>
</UserControl.Resources>
<Grid>
<DataGrid ItemsSource="{Binding Data}">
[..]
<DataGridTextColumn Binding="{Binding Status}">
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Content, RelativeSource={RelativeSource Mode=TemplatedParent}}"/>
<ComboBox SelectedItem="{Binding ElementName=parent, Path=DataContext.StatusFilter}">
<ComboBox.ItemsSource>
<CompositeCollection>
<ComboBoxItem Foreground="Black">All</ComboBoxItem>
<CollectionContainer Collection="{Binding Source={StaticResource StatusValues}}" />
</CompositeCollection>
</ComboBox.ItemsSource>
</ComboBox>
</StackPanel>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>
</DataGrid>
</Grid>
</UserControl>
为了便于阅读,我删除了很多东西,但我认为我认为对描述问题至关重要。如果需要,请随时向我索取更多代码。
此用户控件的目标是向DataGrid添加过滤功能。在其他列中,有一个Status列。当用户在标题的组合框中选择一个状态时,只有具有该状态的元素才会显示在网格中。
一切都运作良好。所选状态与我的视图模型绑定良好。行被很好地过滤等等。我唯一关心的是我得到的以下错误:
System.Windows.Data错误:4:找不到用于引用的绑定源&#39; RelativeSource FindAncestor,AncestorType =&#39; System.Windows.Controls.ItemsControl&#39;,AncestorLevel =&#39; 1& #39;&#39 ;. BindingExpression:路径= HorizontalContentAlignment;的DataItem = NULL;目标元素是&#39; ComboBoxItem&#39; (名称=&#39;&#39); target属性是&#39; HorizontalContentAlignment&#39; (键入&#39; HorizontalAlignment&#39;)
System.Windows.Data错误:4:找不到用于引用的绑定源&#39; RelativeSource FindAncestor,AncestorType =&#39; System.Windows.Controls.ItemsControl&#39;,AncestorLevel =&#39; 1& #39;&#39 ;. BindingExpression:路径= VerticalContentAlignment;的DataItem = NULL;目标元素是&#39; ComboBoxItem&#39; (名称=&#39;&#39); target属性是&#39; VerticalContentAlignment&#39; (键入&#39; VerticalAlignment&#39;)
我自己甚至不使用RelativeSource
和所有这些东西。我的猜测是它被框架或其他东西引用。
但是如何避免这些错误?应用程序在.NET 4.5.2上运行。
我已经阅读了有关设置ComboBoxItem样式的解决方案,但它并没有解决我的问题。我已阅读线程,解释在收集源集合时会发生这种情况,但我的ComboBox集合视图不是这样。
答案 0 :(得分:1)
问题是你在ComboboxItem中托管一个ComboboxItem,一个ComboboxItem设计为托管在一个Combobox中,并将自己绑定到ComboBox的VerticalContentAlignment&amp; HorizontalContentAlignment
这是因为当您设置项目源时,绑定会创建一个ComboboxItem,其中ContentTemplate设置为Combobox的ItemTemplate,DataContent设置为项目源中的项目
所以你需要从复合集合中删除你的ComboBoxItem并设置项容器的样式
例如
<ComboBox SelectedItem="{Binding Filter}">
<ComboBox.ItemContainerStyle>
<Style TargetType="ComboBoxItem">
<Setter Property="Foreground" Value="Black"/> <!--Default Value-->
<Style.Triggers>
<DataTrigger Binding="{Binding}" Value="All"> <!--Using the default binding ie DataContext and if it has a Value of All do the following-->
<Setter Property="Foreground" Value="Green"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ComboBox.ItemContainerStyle>
<ComboBox.ItemsSource>
<CompositeCollection>
<clr:String xmlns:clr="clr-namespace:System;assembly=mscorlib">All</clr:String>
<CollectionContainer Collection="{Binding Mode=OneWay, Source={StaticResource Statuses}}" />
</CompositeCollection>
</ComboBox.ItemsSource>
</ComboBox>