ListBoxItem создает ошибку привязки «System.Windows.Data Error: 4» - PullRequest
27 голосов
/ 18 октября 2010

Я создал следующее ListBox:

<ListBox x:Name="RecentItemsListBox" Grid.Row="1" BorderThickness="0" Margin="2,0,0,0" SelectionChanged="RecentItemsListBox_SelectionChanged">
  <ListBox.Resources>
      <Style TargetType="{x:Type ListBoxItem}"
             BasedOn="{StaticResource {x:Type ListBoxItem}}">
          <Style.Triggers>
              <!--This trigger is needed, because RelativeSource binding can only succeeds if the current ListBoxItem is already connected to its visual parent-->
              <Trigger Property="IsVisible" Value="True">
                  <Setter Property="HorizontalContentAlignment"
                          Value="{Binding Path=HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" />
                  <Setter Property="VerticalContentAlignment"
                          Value="{Binding Path=VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" />
              </Trigger>
          </Style.Triggers>
      </Style>
  </ListBox.Resources>
  <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" Margin="0,2,0,0">
                <TextBlock Text="{Binding Number}" />
                <StackPanel Orientation="Vertical" Margin="7,0,0,0">
                    <TextBlock Text="{Binding File}" />
                    <TextBlock Text="{Binding Dir}" Foreground="DarkGray" />
                </StackPanel>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

. Во время выполнения будет получена следующая строка в окне вывода VisualStudio:

System.Windows.Data Error: 4 : 
 Cannot find source for binding with reference 'RelativeSource FindAncestor, 
 AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. 
 BindingExpression:Path=HorizontalContentAlignment; DataItem=null; 
 target element is 'ListBoxItem' (Name='');

Может кто-нибудь дать мне советКак я могу решить эту проблему?

Обновление :

Я добавил свойства в стиль, чтобы попытаться устранить предупреждение / ошибку.

Ответы [ 3 ]

41 голосов
/ 16 октября 2011

Самый простой способ решить эту проблему - убедиться, что ваш Список имеет ItemContainerStyle . Смотрите следующий пример:

<ListBox x:Name="RecentItemsListBox" Grid.Row="1" BorderThickness="0" Margin="2,0,0,0" SelectionChanged="RecentItemsListBox_SelectionChanged">
    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="HorizontalContentAlignment" Value="Left"/>
            <Setter Property="VerticalContentAlignment" Value="Center"/>
        </Style>
    </ListBox.ItemContainerStyle>

...

</ListBox>

Что происходит, так это то, что ваши Предметы создаются, и по умолчанию они ищут свойство родителя, которое не определено. Явное его определение решит эту проблему.

У меня была та же проблема с использованием TreeView, и изменение связанного источника для этих шаблонов могло вызвать эти предупреждения.

23 голосов
/ 01 ноября 2010

Ответ здесь решил эту проблему для меня:

ListBox с сеткой в ​​виде ItemsPanelTemplate вызывает странные ошибки привязки

Определение стиля верхнего уровня (в моем App.xaml), нацеленного на тип проблемы, «исправил» проблему для меня. Вот стиль, который должен работать для вас:

<Style TargetType="{x:Type ListBoxItem}">
     <Setter Property="HorizontalContentAlignment" Value="Left" />
     <Setter Property="VerticalContentAlignment" Value="Top" />
</Style>

В моем случае я создавал некоторые TreeViewItems, а затем привязывал свой TreeView к созданным элементам. Произошла ошибка привязки, поскольку привязка TreeViewItem была разрешена до того, как они были добавлены в TreeView. Правильным решением было не создать TreeViewItem, а создать класс, содержащий нужные мне данные (заголовок и элементы). Просто передайте мою ситуацию на случай, если есть параллели с вашей.

1 голос
/ 30 ноября 2011

Другой обходной путь, который мне помог, заключался в подавлении этих ошибок (на самом деле, кажется, более уместно называть их предупреждениями), устанавливая уровень переключателя источника привязки данных как критический в конструкторе класса или в окне верхнего уровня -

#if DEBUG     
    System.Diagnostics.PresentationTraceSources.DataBindingSource.Switch.Level =
        System.Diagnostics.SourceLevels.Critical;
#endif

Ссылка: Как подавить предупреждающее сообщение об ошибке System.Windows.Data

Обновление: это не лучшее решение, но для предупреждений, которые являются вредными, это выглядит хорошодля меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...