2

ユーザー向けの UI 上のデータを表すグループ化された WPF DataGrid (標準の Microsoft のもの) があります。

グループ化された領域内の合計を表示するために、XAML で次のように GroupItem DataTemplate をオーバーライドしています。

<Style TargetType="{x:Type GroupItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type GroupItem}">
                <Border BorderBrush="DarkGray" BorderThickness="1" Padding="12,0">
                    <Expander VerticalContentAlignment="Center" IsExpanded="{Binding ., Converter={Converters:ExpandedGroupConverter}}" ExpandDirection="Up">
                        <Expander.Header>
                                <Canvas>
                                **<TextBlock Text="{Binding} />**
                            </Canvas>
                        </Expander.Header>
                        <ItemsPresenter/>
                    </Expander>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

現在、実行時に TextBlock テキストは CollectionViewGroup である DataContext にバインドされます。これは、グリッドがデータソースをラップする CollectionView にバインドされているため意味があります。

ただし、CollectionViewGroup は非常に制限されており、グループを配置する場所などのプロパティを格納している ViewModel にアクセスできず (最初にグリッドをレイアウトするときに列から座標を収集しています)、バインドする必要があります。たとえば、グループ内の特定の列の真上/真下に合計を表示できるようにします。

簡単に言うと、GroupItem を対象とする DataTemplate 内から CollectionView オブジェクト以外にもアクセスしようとしています。これを行う方法に関するご意見 (または、グループ合計テンプレートに表示する列ごとの合計合計を取得するためのより良い方法がある場合) は高く評価されます。

編集:これまでのところ、回避策はアイテムに「Parent ViewModel」プロパティを設定することですが、これによりモデルが肥大化しますが、これを行うためのより直接的な方法があればいいのにと思います。

4

1 に答える 1

3

CollectionViewGroup を使用すると、このグループに含まれるすべてのアイテムにアクセスできます。テンプレート内から他の情報にアクセスしたい場合は、RelativeSource とのバインドを試すことができます。

編集:

したがって、ItemVM のコレクションがあり、その上に ItemVM.GroupProperty の CollectionViewGroup があるとします。次に、グループ内の最初の ItemVM にアクセスできます

 Binding={ Path = Items[0].AnyPropertyOnItemVM }

GroupItemsで計算したり何かをしたい場合は、コンバーターを使用する必要があると思います

于 2011-03-28T11:23:52.113 に答える