WPF: Как отлаживать ошибки привязки?
Я получаю это в своем окне вывода:
Ошибка System.Windows.Data: 4: не удается найти источник для привязки со ссылкой 'RelativeSource FindAncestor, AncestorType =' System.Windows.Controls.ItemsControl ', AncestorLevel =' 1 ''. BindingExpression: Path = VerticalContentAlignment; DataItem = NULL; целевой элемент - 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>
Ответы
Ответ 1
Я также порекомендую статью Bea Stollnitz, но Джонатан Аллен получил свой пост, пока я все еще печатал его. Я также рекомендую ссылки в эту запись в блоге.
В этом конкретном случае вы можете видеть, что где-то ListBoxItem имеет привязку FindAncestor к ItemControl, которая терпит неудачу. Это сразу говорит вам, что есть ListBoxItem где-то:
- Не в визуальном дереве, или
- Не под элементом ItemsControl (ListBox - элемент управления ItemsControl)
Кроме того, вы знаете, что кто-то, где-то, привязывает свойство ListBoxItem VerticalContentAlignment к FindAncestor.
Рассматривая системные темы (поставляемые с Expression Blend, а также доступные через надстройку BFLViewer NET Reflector), мы видим следующее:
<Style x:Key="{x:Type ListBoxItem}">
<Setter Property="VerticalContentAlignment"
Value="{Binding Path=VerticalContentAlignment,RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}" />
Это объясняет, откуда происходит привязка. Следующий вопрос: как создается ListBoxItem, который не находится в ListBox (или другом ItemsControl)?
Некоторые вещи, которые нужно искать:
- Вы строите ListBoxItems в коде где угодно?
- Есть ли какой-либо элемент ListBoxItem, явно указанный в вашем XAML?
- У вас есть код, который вручную манипулирует элементами в ListBox?
Надеюсь, это приведет вас в правильном направлении.
Ответ 2
У меня возникла аналогичная проблема с TreeView (хотя мои ошибки привязки данных появились как информационные).
Я решил проблему, указав неявный стиль в ресурсе TreeView для TreeViewItem. В этом стиле я определил отсутствующие свойства выравнивания вертикального и горизонтального содержимого.
<TreeView.Resources>
<Style TargetType="{x:Type TreeViewItem}" >
<Setter Property="VerticalContentAlignment" Value="Stretch"/>
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>
</TreeView.Resources>