我有一个消息列表,我根据每条消息所属的服务器(serverId)对它们进行分组,如下所示 -
<CollectionViewSource x:Key="MessageTypesByServer"
Source="{Binding MessageTypes, Mode=OneWay}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="ServerId" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
并使用 aGroup Style
以这样的方式显示每个组GroupBox
-
<GroupBox Margin="0,0,0,3"
Header="{Binding Name}">
<ItemsPresenter />
</GroupBox>
现在,如果消息来自单个服务器,那么我不想在标题中显示 serverId,GroupBox
为此我需要找出其中的组数CollectionViewSource
;
如何在 XAML 中执行此操作?(我知道我可以在我的 VM 中找到它,并根据 VM 中的属性隐藏/显示标头等,但我想在 XAML 中执行此操作)。
更新:
我尝试像这样使用 CollectionViewSource.View -
<Style TargetType="{x:Type GroupBox}">
<Setter Property="Header" Value="{Binding Name}" />
<Style.Triggers>
<DataTrigger Binding="{Binding View.Groups.Count, Source={StaticResource MessageTypesByServer}}"
Value="1">
<Setter Property="Header" Value="No Server Name" />
</DataTrigger>
</Style.Triggers>
</Style>
但这不起作用, View 始终为空(在 Snoop 中看到时)。
更新 2
我能够让它与这样的转换器一起工作 -
<DataTrigger Binding="{Binding Path=., Source={StaticResource MessageTypesByServer},
Converter={ValueConverters:CollectionViewSourceToGroupCountConverter}}"
Value="1">
<Setter Property="Header" Value="{x:Static System:String.Empty}" />
</DataTrigger>
和转换器逻辑 -
ICollectionView view = value as ICollectionView;
if (view != null)
{
return view.Groups.Count;
}
return 0;
虽然很好,但如果我能在没有转换器的情况下做到这一点,我会很高兴!有人知道为什么第一次更新中的代码不起作用吗?