2013-07-25 60 views
0

我有一个wpf数据网格分组行,使用CollectionViewSource实现。看起来组头模板直接绑定到CollectionViewGroup对象,但由于某些原因,这些在CVS内部并不是很容易访问。你给了组名称CollectionViewSource,它处理在幕后生成CVG。如果您希望组标题样式绑定到除CVG公开的几个属性之外的东西,例如NameItemCount,这会使事情变得困难。WPF datagrid - 灵活绑定组标题

基本上,我希望每个组都有一个Status属性,可能由组头背景颜色直观指示。这Status可以改变,所以不知何故标题将不得不检测propertychanged通知。但由于CollectionViewGroup没有Status属性,并且我无法将自己的CVG提供给CollectionViewSource,所以我不知道如何执行此简单任务。

回答

1

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

我设置它像这样(vb.net遵循):

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

这意味着所有行(更具体地,所述的ViewModels各行绑定到)将根据一个称为属性被分组ProductGroup。现在,我在我自己组对象添加到CollectionView组描述:

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

因此,通过增加pgGroupNames集合意味着它现在可以被引用,并绑定到在XAML组头造型 - 这是Name对象。请注意,我还将pg添加到我创建的第二个私人收藏_ProductGroupVMs。这有点冒险,但这样我可以保留对所有组对象的引用 - 当我创建行视图模型时,它们将具有ProductGroup属性,并且ProductGroup需要指向右边的pg以便将它们分组正确。可能有更干净的方法来做到这一点,但这是我走的路线。

+1

Tekito,昨天我试图解决这个问题的时候,有一个小例子可能是个例外。我想我的主要问题是,你如何告诉CollectionViewSource'Name'对象的属性用于分组? – dansan

+1

@dansan好的,我添加了一些代码。但是我的'CVS'没有通过'Name'属性进行分组 - 它通过引用Name对象本身进行分组。行的绑定对象都有一个名为'ProductGroup'的属性,指向它所属的'Name'对象。 – Tekito