如果其子项(即 ItemsControl)的 ItemsSource 中没有数据,我需要隐藏 GroupBox。
例如。 ItemsControl 将绑定到集合(OptionalReads)。此 ItemsControl 的祖先是 GroupBox。我需要将此 GroupBox 的可见性绑定到 ItemsControl 的 ItemSource 的计数。
我尝试和工作的是OptionalReads.Count属性的直接绑定,如下所示:-
<GroupBox Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="4" Header="Optional Reads" Template="{StaticResource GroupBoxTemplate}">
<GroupBox.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding OptionalReads.Count}" Value="0">
<Setter Property="GroupBox.Visibility" Value="Hidden" />
</DataTrigger>
</Style.Triggers>
</Style>
</GroupBox.Style>
<ItemsControl Name="OptionalReadItemsControl" HorizontalContentAlignment="Stretch" ItemsSource="{Binding OptionalReads}">
<ItemsControl.ItemTemplate>.... </ItemsControl.ItemTemplate>
</ItemsControl>
</GroupBox>
但是我需要做的是将这种样式移动为通用样式并应用于具有相同结构的各种 GroupBox。
如果我们需要获取父控件的 ItemsSource 并在父控件中没有数据时隐藏 GroupBox,我可以这样做,如下所示:-
<Style TargetType="{x:Type GroupBox}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=ItemsSource.Count, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"
Value="0">
<Setter Property="GroupBox.Visibility" Value="Hidden" />
</DataTrigger>
</Style.Triggers>
</Style>
但是,我们如何以这种方式实现相同的概念,动态识别子控件并绑定到子控件的 ItemsSource 的计数。
GroupBox 中托管的元素,其内容可以在 GroupBox.Content 属性中捕获。因此,您可以通过RelativeSource捕获ItemsControl。
<GroupBox>
<GroupBox.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=(GroupBox.Content).(ItemsControl.ItemsSource).Count}" Value="0">
<Setter Property="GroupBox.Visibility" Value="Hidden" />
</DataTrigger>
</Style.Triggers>
</Style>
</GroupBox.Style>
<ItemsControl ItemsSource="{Binding ...}"/>
</GroupBox>