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

发布于 2024-10-26 16:36:54 字数 1513 浏览 1 评论 0原文

我有一个分组的 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 文本绑定到 DataContext,这是一个 CollectionViewGroup,这很有意义,因为网格绑定到 CollectionView包装我们的数据源。

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

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

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

I have a grouped WPF DataGrid (the standard Microsoft one) representing some data on the UI for our users.

In order to show totals within the grouped regions, we are overriding the GroupItem DataTemplate as follows in XAML:

<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>

At runtime, currently, the TextBlock text binds to the DataContext, which is a CollectionViewGroup, which makes sense as the grid is binding to a CollectionView wrapping our datasource.

However, the CollectionViewGroup is very limited and does not give us access to its containing ViewModel, where we are storing properties such where to position groups (we're gathering coordinates from the columns when we first layout the grid), and need to bind to them, so that we can, for example, show a total directly above/below given column in a group.

In a nutshell we're trying to access more than just the CollectionView object from within a DataTemplate that targets a GroupItem. Any input on how to do this (or if there is a better approach to get summed totals per columns to show in group total templates) appreciated.

EDIT: So far, a workaround is to have a "Parent ViewModel" property on our items, although this bloats the model, I wish there was a more direct way to do this.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

心房敞 2024-11-02 16:36:54

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

编辑:

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

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

我认为如果您想计算 GroupItems 或对 GroupItems 执行任何操作,则必须使用转换器

CollectionViewGroup gives you access to all items contained in this group. if you want to access other information from within your template, you can try binding with RelativSource.

EDIT:

so if you have a Collection of ItemVM, and on top of this a CollectionViewGroup on ItemVM.GroupProperty. then you can access your 1st ItemVM within a group with

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

i think you will have to use a Converter if you want to calculate or do anything with the GroupItems

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文