访问WPF DataGrid GroupItem DataTemplate中的基础ViewModel属性

时间:2011-03-28 10:39:41

标签: wpf data-binding datagrid datatemplate collectionview

我有一个分组的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”属性,虽然这会使模型膨胀,但我希望有更直接的方法来执行此操作。

1 个答案:

答案 0 :(得分:3)

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

编辑:

所以如果你有ItemVM的集合,那么在ItemVM.GroupProperty上有一个CollectionViewGroup。然后,您可以使用

访问组内的第一个ItemVM
 Binding={ Path = Items[0].AnyPropertyOnItemVM }

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