私はメッセージのリストを持っていて、次のように、各メッセージが属する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;
大丈夫ですが、コンバーターなしでできたら嬉しいです!最初のアップデートのコードが機能しない理由を知っている人はいますか?