我有一个分组的 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 文本绑定(bind)到 DataContext,它是一个 CollectionViewGroup,这很有意义,因为网格绑定(bind)到包装我们数据源的 CollectionView。
但是,CollectionViewGroup 非常有限,不允许我们访问其包含的 ViewModel,我们在其中存储属性,例如放置组的位置(当我们第一次布局网格时,我们从列中收集坐标),并且需要绑定(bind)到它们,这样我们就可以在组中的给定列的上方/下方显示总计。
简而言之,我们尝试从针对 GroupItem 的 DataTemplate 中访问的不仅仅是 CollectionView 对象。任何有关如何执行此操作的意见(或者是否有更好的方法来获取每列的总计以在组总计模板中显示),我们将不胜感激。
编辑:到目前为止,解决方法是在我们的项目上有一个“Parent ViewModel”属性,尽管这会使模型膨胀,但我希望有一种更直接的方法来做到这一点。
最佳答案
CollectionViewGroup 使您可以访问该组中包含的所有项目。如果您想从模板中访问其他信息,可以尝试使用 RelativSource 进行绑定(bind)。
编辑:
因此,如果您有一个 ItemVM 集合,并且在此之上有一个 ItemVM.GroupProperty 上的 CollectionViewGroup。然后您可以使用以下命令访问组中的第一个 ItemVM
Binding={ Path = Items[0].AnyPropertyOnItemVM }
如果您想计算或对 GroupItem 执行任何操作,我认为您必须使用转换器
关于wpf - 访问 WPF DataGrid GroupItem DataTemplate 中的基础 ViewModel 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5457776/