【问题标题】:WPF datagrid - flexible binding for group headersWPF datagrid - 组标题的灵活绑定
【发布时间】:2013-07-25 21:53:34
【问题描述】:

我有一个带有分组行的 wpf 数据网格,使用 CollectionViewSource 实现。看起来组头模板直接绑定到CollectionViewGroup 对象,但由于某种原因,这些在 CVS 中不是很容易访问。您给CollectionViewSource 提供组名,它会在幕后处理生成CVG。如果您希望组标题样式绑定到 CVG 所公开的少数属性(例如 NameItemCount)之外的其他内容,这会使事情变得困难。

基本上,我希望每个组都有一个Status 属性,可能通过组标题背景颜色在视觉上指示。这个Status 可以更改,因此标题必须以某种方式检测propertychanged 通知。但是由于CollectionViewGroup 没有Status 属性,并且我无法将自己的CVG 提供给CollectionViewSource,所以我不知道如何完成这个简单的任务。

【问题讨论】:

    标签: wpf datagrid collectionviewsource


    【解决方案1】:

    我终于明白了。 CollectionViewGroupName 属性是一个对象,因此您可以创建所需属性的组视图模型,然后在将组描述添加到CollectionViewSource 时将其作为Name 给出。然后在 xaml 中为组头控件做嵌套绑定到Name.whatever

    我是这样设置的(vb.net 跟随):

      Me.BindedCV = New Data.CollectionViewSource
      Me.BindedCV.GroupDescriptions.Add(New Data.PropertyGroupDescription("ProductGroup"))
    

    这意味着所有行(更具体地说,行绑定到的视图模型)将根据名为ProductGroup 的属性进行分组。现在我将自己的组对象添加到CollectionView 组描述中:

            Dim pg = New ProductGroupVM(pd.Index)
            Me._ProductGroupVMs.Add(pg)
            Me.BindedCV.GroupDescriptions(0).GroupNames.Add(pg)
    

    因此,通过将 pg 添加到 GroupNames 集合意味着它现在可以在 xaml 组标题样式中被引用和绑定 - 它是 Name 对象。请注意,我还将pg 添加到我创建的名为_ProductGroupVMs 的第二个私人集合中。这有点骇人听闻,但这样我可以保留对所有组对象的引用 - 当我创建行视图模型时,它们将具有 ProductGroup 属性,并且 ProductGroup 需要指向右侧的 pg以便他们正确分组。可能有更清洁的方法可以做到这一点,但我就是这样走的。

    【讨论】:

    • Tekito,如果我昨天试图解决这个问题,那么有一个小例子是个例外。我想我的主要问题是,你如何告诉 CollectionViewSource 使用“名称”对象的哪个属性来分组?
    • @dansan 好的,我添加了一些代码。但是我的CVS 没有按Name 的属性分组-它通过引用Name 对象本身进行分组。行的绑定对象都有一个名为ProductGroup 的属性,该属性指向它们所属的Name 对象。
    猜你喜欢
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 2011-07-10
    • 2011-08-15
    • 1970-01-01
    • 2018-01-17
    相关资源
    最近更新 更多