我在输出窗口中收到了这个:
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>
答案 0 :(得分:10)
我还打算推荐Bea Stollnitz's article,但乔纳森·艾伦在我还在输入这个帖子的时候得到了他的职位。我还推荐this blog entry中的链接。
在这种特殊情况下,您可以看到ListBoxItem的某个地方有FindAncestor绑定到失败的ItemsControl。这告诉你马上就有一个ListBoxItem:
此外,您知道有人在某处将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?
要寻找的一些事情:
希望这会引导你朝着正确的方向前进。
答案 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>