WPF:如何调试绑定错误?

时间:2010-06-05 18:36:54

标签: wpf binding

我在输出窗口中收到了这个:

  

System.Windows.Data错误:4:无法找到与引用'RelativeSource FindAncestor绑定的源,AncestorType ='System.Windows.Controls.ItemsControl',AncestorLevel ='1''。 BindingExpression:路径= VerticalContentAlignment;的DataItem = NULL; target元素是'ListBoxItem'(Name =''); target属性是'VerticalContentAlignment'(类型'VerticalAlignment')

这是我的XAML,运行时看起来正确

        <GroupBox Header="Grant/Deny Report">
            <ListBox ItemsSource="{Binding  Converter={StaticResource MethodBinder}, ConverterParameter=GrantDeny, Mode=OneWay}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Label Content="{Binding Entity}"/>
                            <Label Content="{Binding HasPermission}"/>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </GroupBox>

2 个答案:

答案 0 :(得分:10)

我还打算推荐Bea Stollnitz's article,但乔纳森·艾伦在我还在输入这个帖子的时候得到了他的职位。我还推荐this blog entry中的链接。

在这种特殊情况下,您可以看到ListBoxItem的某个地方有FindAncestor绑定到失败的ItemsControl。这告诉你马上就有一个ListBoxItem:

  1. 不在可视树中,或
  2. 不在ItemsControl下(ListBox是ItemsControl)
  3. 此外,您知道有人在某处将ListBoxItem的VerticalContentAlignment属性绑定到FindAncestor。

    查看系统主题(Expression Blend附带,也可以通过NET Reflector的BAMLViewer外接程序获得),我们看到了:

    <Style x:Key="{x:Type ListBoxItem}">
      <Setter Property="VerticalContentAlignment"
              Value="{Binding Path=VerticalContentAlignment,RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}" />
    

    这解释了绑定的来源。接下来的问题是,如何创建一个不在ListBox(或其他ItemsControl)下的ListBoxItem?

    要寻找的一些事情:

    • 您是否在任何地方的代码中构建ListBoxItems?
    • 您的XAML中是否明确指定了任何ListBoxItem?
    • 您是否有任何手动操作ListBox项目的代码?

    希望这会引导你朝着正确的方向前进。

答案 1 :(得分:3)

我遇到了与TreeView类似的问题(虽然我的数据绑定错误显示为信息)。

我通过在TreeView资源的TreeView资源中定义隐式样式来解决问题。在该样式中,我定义了缺少的垂直和水平内容对齐属性。

<TreeView.Resources>
     <Style TargetType="{x:Type TreeViewItem}" >
          <Setter Property="VerticalContentAlignment" Value="Stretch"/>
          <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
     </Style>
</TreeView.Resources>