我有一个消息列表,我根据每个消息所属的服务器(serverId)对它们进行分组,如下所示 -
<CollectionViewSource x:Key="MessageTypesByServer"
Source="{Binding MessageTypes, Mode=OneWay}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="ServerId" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
并使用Group Style
在GroupBox
中显示每个组 -
<GroupBox Margin="0,0,0,3"
Header="{Binding Name}">
<ItemsPresenter />
</GroupBox>
现在,如果消息来自单个服务器,那么我不想在GroupBox
的标题中显示serverId,为此,我需要找出{{1}中的组数}};
如何在XAML中执行此操作? (我知道我可以在我的VM中找到它并根据VM中的属性隐藏/显示标题等但我想在XAML中执行此操作。)
更新
我尝试使用像这样的CollectionViewSource.View -
CollectionViewSource
但这不起作用,View始终为null(在Snoop中看到)。
更新2
我能够使用像这样的转换器 -
<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>
和转换器逻辑 -
<DataTrigger Binding="{Binding Path=., Source={StaticResource MessageTypesByServer},
Converter={ValueConverters:CollectionViewSourceToGroupCountConverter}}"
Value="1">
<Setter Property="Header" Value="{x:Static System:String.Empty}" />
</DataTrigger>
虽然很好,如果我能在没有转换器的情况下做到这一点,我会很高兴的!任何人都知道为什么第1次更新中的代码不起作用?
答案 0 :(得分:2)
您可以绑定到CollectionViewSource
并访问View.Groups
属性,这是observable collection of groups - cvs.View.Groups.Count
就是您的目标。
请记住,即使只涉及一台服务器,用户也应该能够以某种方式识别哪一个。