ListBoxItem produit " Système.Windows.Erreur de données: 4 " erreur de liaison

J'ai créé la jachère 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>

Cela produira à L'exécution la ligne de jachère dans la fenêtre de sortie de 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='');

Quelqu'un peut-il me donner un conseil, comment je peux résoudre cela?

Mise à Jour:

J'ai ajouté les propriétés au style pour essayer d'éliminer l'avertissement / erreur.

25
demandé sur akjoshi 2010-10-18 14:15:41

3 réponses

De La façon la plus simple de résoudre ce problème est de s'assurer que votre Listbox a un ItemContainerStyle. Voir l'exemple suivant:

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

Ce qui se passe, c'est que vos éléments sont créés et, par défaut, ils recherchent la propriété du parent qui n'est pas définie. Le définir explicitement résoudra ce problème.

J'ai eu le même problème en utilisant un TreeView et changer la source liée pour ces modèles provoquerait ces avertissements.

35
répondu Etienne 2011-10-15 22:08:04

La réponse ici a résolu ce problème pour moi:

ListBox avec grille comme ItemsPanelTemplate produit des erreurs de liaison étranges

Définir un style de niveau supérieur (dans mon application.XAML) ciblant le type de problème "fixe" le problème pour moi. Voici un style qui devrait fonctionner pour vous:

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

Dans mon cas, je créais des TreeViewItems, puis je Liais mon TreeView aux éléments créés. L'erreur de liaison se produisait car la liaison de TreeViewItem était en cours de résolution avant qu'ils ne soient ajoutés à la TreeView. La solution correcte était de ne pas créer un TreeViewItem, mais plutôt de créer une classe contenant les données dont j'avais besoin (en-tête et éléments). Juste relayer Ma situation au cas où il y aurait des parallèles avec la vôtre.

19
répondu bsegraves 2017-05-23 12:02:12

Une autre solution de contournement qui a fonctionné pour moi était de supprimer ces erreurs (en fait, il semble plus approprié de les appeler des avertissements) en définissant le niveau du commutateur de source de liaison de données comme critique dans le constructeur de la classe ou une fenêtre de niveau supérieur-

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

Réf.: Comment supprimer le système.Windows.Message d'avertissement d'erreur de données

Update: ce n'est pas la meilleure solution mais pour les avertissements qui sont nocifs, cela me semble bon.

1
répondu akjoshi 2013-05-21 06:55:56