0

我有一个消息列表,我根据每条消息所属的服务器(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;

虽然很好,但如果我能在没有转换器的情况下做到这一点,我会很高兴!有人知道为什么第一次更新中的代码不起作用吗?

4

1 回答 1

2

您可以绑定到CollectionViewSource并访问该View.Groups属性,这是一个可观察的组集合——cvs.View.Groups.Count这就是您所追求的。

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

于 2012-09-04T08:28:31.093 回答