WPF: Как я отлаживаю ошибки привязки?

Я получаю это в своем окне вывода:

Система. Windows. Ошибка данных: 4: не Может найти источник для привязки со ссылочным 'RelativeSource FindAncestor, AncestorType ='System. Windows. Средства управления. ItemsControl', AncestorLevel = '1''. BindingExpression:Path=VerticalContentAlignment; DataItem=null; целевым элементом является 'ListBoxItem' (Имя = ''); целевым свойством является '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>
13
задан Jonathan Allen 5 June 2010 в 18:36
поделиться

1 ответ

Я также собирался порекомендовать статью Bea Stollnitz , но Джонатан Аллен получил свой пост, пока я его еще печатал. Я также рекомендую ссылки в этой записи блога .

В этом конкретном случае вы можете видеть, что где-то ListBoxItem имеет привязку FindAncestor к ItemsControl, которая дает сбой. Это сразу говорит вам о том, что где-то есть ListBoxItem, который либо:

  1. Не в визуальном дереве, либо
  2. Не в ItemsControl (ListBox - это ItemsControl)

Кроме того, вы знаете, что кто-то где-то , связывает свойство 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}}" />

Это объясняет, откуда берется привязка. Следующий вопрос: как создается ListBoxItem, который не находится в ListBox (или другом ItemsControl)?

Некоторые вещи, на которые следует обратить внимание:

  • Вы где-нибудь создаете ListBoxItems в коде?
  • Есть ли какой-нибудь ListBoxItem явно указан в вашем XAML?
  • Есть ли у вас какой-либо код, который вручную манипулирует элементами в ListBox?

Надеюсь, это направит вас в правильном направлении.

10
ответ дан 2 December 2019 в 00:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: