.net wpf xaml listbox listboxitem

.net - ListBoxItem produce un error de enlace "System.Windows.Data Error: 4"



wpf combobox (3)

He creado el siguiente 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>

Esto producirá en tiempo de ejecución la siguiente línea en OutputWindow of 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='''');

¿Puede alguien darme un consejo, cómo puedo resolver esto?

Actualización :

He agregado las Propiedades al estilo para tratar de eliminar la advertencia / error.


La forma más fácil de resolver esto es asegurarse de que su Listbox tenga un ItemContainerStyle . Vea el siguiente ejemplo:

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

Lo que ocurre es que sus Elementos se están creando y, de forma predeterminada, buscan la propiedad de los padres que no está definida. Definirlo explícitamente resolverá este problema.

Tuve el mismo problema al usar TreeView y cambiar el origen de estas plantillas provocaría esas advertencias.


La respuesta aquí resuelta este problema para mí:

ListBox con Grid como ItemsPanelTemplate produce errores de enlace extraños

La definición de un estilo de nivel superior (en mi App.xaml) que se dirige al tipo de problema "solucionó" el problema para mí. Aquí hay un estilo que debería funcionar para usted:

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

En mi caso, estaba creando algunos TreeViewItems y luego vinculando mi TreeView a los elementos creados. El error de enlace se estaba produciendo porque el enlace de TreeViewItem se estaba resolviendo antes de que se agregaran a TreeView. La solución correcta fue no crear un TreeViewItem, sino crear una clase que contuviera los datos que necesitaba (encabezado y elementos). Solo transmitir mi situación en caso de que haya paralelismos con la suya.


Otra solución que funcionó para mí fue suprimir estos errores (en realidad, parece más apropiado llamarlos advertencias) al configurar el nivel de cambio de fuente de enlace de datos como crítico en el constructor de la clase o en una ventana de nivel superior -

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

Ref .: Cómo suprimir el mensaje de advertencia de error System.Windows.Data

Actualización: Esta no es la mejor solución, pero para las advertencias que son perjudiciales, esto se ve bien para mí.