I have created the fallowing 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>
This will produce at runtime the fallowing Line in the 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='');
Can someone give me a tip, how I can solve this?
Update:
I have added the Properties to the style to try to eliminate the warning/error.
The easiest way to solve this is to ensure that your Listbox has a ItemContainerStyle. See the following example:
<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>
What happens is that your Items are being created, and by default they look for parent's property which isn't defined. Explicitly defining it will solve this problem.
I had the same issue using a TreeView and changing the bound source for these templates would cause those warnings.
The answer over here resolved this issue for me:
ListBox with Grid as ItemsPanelTemplate produces weird binding errors
Defining a top-level style (in my App.xaml) targeting the problem type "fixed" the issue for me. Here's a style that should work for you:
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="HorizontalContentAlignment" Value="Left" />
<Setter Property="VerticalContentAlignment" Value="Top" />
</Style>
In my case, I was creating some TreeViewItems and then binding my TreeView to the created items. The binding error was occurring because the TreeViewItem's binding was being resolved before they were being added to the TreeView. The correct solution was to not create a TreeViewItem, but instead create a class that contained the data I needed (Header and Items). Just relaying my situation in case there are parallels with your own.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With