查找使用CollectionViewSource分组创建的组数

时间:2012-09-03 12:54:52

标签: .net wpf xaml collectionviewsource

我有一个消息列表,我根据每个消息所属的服务器(serverId)对它们进行分组,如下所示 -

<CollectionViewSource x:Key="MessageTypesByServer"
                      Source="{Binding MessageTypes, Mode=OneWay}">
    <CollectionViewSource.GroupDescriptions>
        <PropertyGroupDescription PropertyName="ServerId" />
    </CollectionViewSource.GroupDescriptions>
</CollectionViewSource>

并使用Group StyleGroupBox中显示每个组 -

<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次更新中的代码不起作用?

1 个答案:

答案 0 :(得分:2)

您可以绑定到CollectionViewSource并访问View.Groups属性,这是observable collection of groups - cvs.View.Groups.Count就是您的目标。

请记住,即使只涉及一台服务器,用户也应该能够以某种方式识别哪一个