ListBoxItem生成“System.Windows.Data Error:4”绑定错误

时间:2010-10-18 10:15:42

标签: .net wpf xaml listbox listboxitem

我已经创建了ListBox

<ListBox x:Name="RecentItemsListBox" Grid.Row="1" BorderThickness="0" Margin="2,0,0,0" SelectionChanged="RecentItemsListBox_SelectionChanged">
  <ListBox.Resources>
      <Style TargetType="{x:Type ListBoxItem}"
             BasedOn="{StaticResource {x:Type ListBoxItem}}">
          <Style.Triggers>
              <!--This trigger is needed, because RelativeSource binding can only succeeds if the current ListBoxItem is already connected to its visual parent-->
              <Trigger Property="IsVisible" Value="True">
                  <Setter Property="HorizontalContentAlignment"
                          Value="{Binding Path=HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" />
                  <Setter Property="VerticalContentAlignment"
                          Value="{Binding Path=VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" />
              </Trigger>
          </Style.Triggers>
      </Style>
  </ListBox.Resources>
  <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" Margin="0,2,0,0">
                <TextBlock Text="{Binding Number}" />
                <StackPanel Orientation="Vertical" Margin="7,0,0,0">
                    <TextBlock Text="{Binding File}" />
                    <TextBlock Text="{Binding Dir}" Foreground="DarkGray" />
                </StackPanel>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

这将在运行时生成VisualStudio的OutputWindow中的延迟线:

System.Windows.Data Error: 4 : 
 Cannot find source for binding with reference 'RelativeSource FindAncestor, 
 AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. 
 BindingExpression:Path=HorizontalContentAlignment; DataItem=null; 
 target element is 'ListBoxItem' (Name='');

有人可以给我一个小费,我怎么能解决这个问题?

更新

我已将样式添加到样式中以尝试消除警告/错误。

5 个答案:

答案 0 :(得分:40)

解决此问题的最简单方法是确保 列表框 具有 ItemContainerStyle 。请参阅以下示例:

<ListBox x:Name="RecentItemsListBox" Grid.Row="1" BorderThickness="0" Margin="2,0,0,0" SelectionChanged="RecentItemsListBox_SelectionChanged">
    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="HorizontalContentAlignment" Value="Left"/>
            <Setter Property="VerticalContentAlignment" Value="Center"/>
        </Style>
    </ListBox.ItemContainerStyle>

...

</ListBox>

您的项目正在创建中,默认情况下会查找未定义的父项属性。明确定义它将解决这个问题。

我使用TreeView遇到了同样的问题,更改这些模板的绑定源会导致这些警告。

答案 1 :(得分:23)

这里的答案为我解决了这个问题:

ListBox with Grid as ItemsPanelTemplate produces weird binding errors

定义一个顶级样式(在我的App.xaml中),针对问题类型“修复”了我的问题。这是一种适合你的风格:

<Style TargetType="{x:Type ListBoxItem}">
     <Setter Property="HorizontalContentAlignment" Value="Left" />
     <Setter Property="VerticalContentAlignment" Value="Top" />
</Style>

就我而言,我创建了一些TreeViewItems,然后将TreeView绑定到创建的项目。发生绑定错误是因为TreeViewItem的绑定在被添加到TreeView之前正在解析。正确的解决方案是不创建TreeViewItem,而是创建一个包含我需要的数据的类(Header和Items)。只是转发我的情况,以防与你自己的情况相提并论。

答案 2 :(得分:1)

另一个对我有用的解决方法是通过将数据绑定源开关级别设置为类的构造函数或顶级窗口中的关键来抑制这些错误(实际上,将它们称为警告似乎更合适) -

#if DEBUG     
    System.Diagnostics.PresentationTraceSources.DataBindingSource.Switch.Level =
        System.Diagnostics.SourceLevels.Critical;
#endif

参考:How to suppress the System.Windows.Data Error warning message

更新:这不是最好的解决方案,但对于有害的警告,这对我来说很好。

答案 3 :(得分:0)

对我来说,罪魁祸首是 TreeView,而不是 ListView。我按照@bsegraves 的建议将全局样式添加到我的 App.xaml 中:

<Style TargetType="{x:Type TreeViewItem}">
    <Setter Property="HorizontalContentAlignment" Value="Left" />
    <Setter Property="VerticalContentAlignment" Value="Top" />
</Style>

我还必须将以下内容添加到我的 TreeView:

<TreeView.ItemContainerStyle>
    <Style
        BasedOn="{StaticResource {x:Type TreeViewItem}}"
        TargetType="{x:Type TreeViewItem}">         
    </Style>
</TreeView.ItemContainerStyle>

出于某种原因,BasedOn 属性是缺失的部分。 (我尝试了@Etienne 的方法,但没有奏效。)

答案 4 :(得分:0)

这些 HorizontalContentAlignmentVerticalContentAlignment 问题是由于容器未分别定义其 HorizontalAlignmentVerticalAlignment 引起的。

因此,我没有为 ListBoxItemTreeViewItem 或更糟的直接彻底设置这些属性制作通用样式,而是在我的 ItemsControl 中为 App.xaml 创建了通用样式解决了导致此问题的任何原因:

<Style TargetType="{x:Type ItemsControl}">
        <Setter Property="HorizontalAlignment" Value="Left" />
        <Setter Property="VerticalAlignment" Value="Top" />
</Style>