Подтвердить что ты не робот

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>
4b9b3361

Ответ 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>