绑定错误不是由于我的代码

时间:2017-06-23 09:56:32

标签: c# wpf

我有一个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:路径= Horizo​​ntalContentAlignment;的DataItem = NULL;目标元素是&#39; ComboBoxItem&#39; (名称=&#39;&#39); target属性是&#39; Horizo​​ntalContentAlignment&#39; (键入&#39; Horizo​​ntalAlignment&#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集合视图不是这样。

1 个答案:

答案 0 :(得分:1)

问题是你在ComboboxItem中托管一个ComboboxItem,一个ComboboxItem设计为托管在一个Combobox中,并将自己绑定到ComboBox的VerticalContentAlignment&amp; Horizo​​ntalContentAlignment

这是因为当您设置项目源时,绑定会创建一个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>