Reputation: 6279
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.
Upvotes: 35
Views: 25362
Reputation: 518
These HorizontalContentAlignment
and VerticalContentAlignment
issues are caused because the container is not defining its HorizontalAlignment
and VerticalAlignment
respectively.
So instead of making generic style(s) for ListBoxItem
, TreeViewItem
or worse exhaustively setting those properties directly, I made a generic style for ItemsControl
in my App.xaml
that solved whatever is causing this issue like this:
<Style TargetType="{x:Type ItemsControl}">
<Setter Property="HorizontalAlignment" Value="Left" />
<Setter Property="VerticalAlignment" Value="Top" />
</Style>
Upvotes: 0
Reputation: 3774
For me, the culprit was a TreeView, not a ListView. I added the global style to my App.xaml as suggested by @bsegraves:
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="HorizontalContentAlignment" Value="Left" />
<Setter Property="VerticalContentAlignment" Value="Top" />
</Style>
I also had to add the following to my TreeView:
<TreeView.ItemContainerStyle>
<Style
BasedOn="{StaticResource {x:Type TreeViewItem}}"
TargetType="{x:Type TreeViewItem}">
</Style>
</TreeView.ItemContainerStyle>
For some reason, the BasedOn attribute was the missing piece. (I tried @Etienne's approach, but it didn't work.)
Upvotes: 1
Reputation: 15802
Another workaround that worked for me was to suppress these errors (actually, it seems more appropriate to call them warnings) by setting the data binding source switch level as critical in constructor of the class or a top level window -
#if DEBUG
System.Diagnostics.PresentationTraceSources.DataBindingSource.Switch.Level =
System.Diagnostics.SourceLevels.Critical;
#endif
Ref.: How to suppress the System.Windows.Data Error warning message
Update: This is not the best solution but for warnings which are harmful this looks good to me.
Upvotes: 0
Reputation: 1020
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.
Upvotes: 30
Reputation: 1207
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.
Upvotes: 57