0

私はメッセージのリストを持っていて、次のように、各メッセージが属するserver(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>

ここで、メッセージが単一のサーバーからのものである場合、のヘッダーに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は常にnullです(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.Groupscvs.View.Groups.Count

関係するサーバーが 1 つだけの場合でも、ユーザーはどのサーバーかを何らかの形で識別できるはずです。

于 2012-09-04T08:28:31.093 に答える