2

我有一个分组的 WPF DataGrid(标准的 Microsoft 数据网格),为我们的用户代表 UI 上的一些数据。

为了显示分组区域内的总数,我们在 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 文本绑定到 DataContext,这是一个 CollectionViewGroup,这很有意义,因为网格绑定到了一个包含我们数据源的 CollectionView。

但是,CollectionViewGroup 非常有限,无法访问其包含的 ViewModel,我们在其中存储属性,例如放置组的位置(我们在第一次布局网格时从列中收集坐标),并且需要绑定到例如,我们可以在组中给定列的上方/下方显示总数。

简而言之,我们试图从以 GroupItem 为目标的 DataTemplate 中访问的不仅仅是 CollectionView 对象。任何有关如何执行此操作的输入(或者是否有更好的方法来获取每列的总和以显示在组总模板中)表示赞赏。

编辑:到目前为止,一种解决方法是在我们的项目上有一个“父 ViewModel”属性,虽然这会使模型膨胀,但我希望有一种更直接的方法来做到这一点。

4

1 回答 1

3

CollectionViewGroup 使您可以访问该组中包含的所有项目。如果您想从您的模板中访问其他信息,您可以尝试与 RelativSource 绑定。

编辑:

因此,如果您有一个 ItemVM 集合,并且在此之上还有一个 ItemVM.GroupProperty 上的 CollectionViewGroup。然后您可以访问组中的第一个 ItemVM

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

我认为如果你想计算或对 GroupItems 做任何事情,你将不得不使用转换器

于 2011-03-28T11:23:52.113 回答