简体   繁体   English

如何在XAML中为自定义DataGrid控件指定GroupDescriptions?

[英]How to specify GroupDescriptions in XAML for a custom DataGrid control?

I have a GroupingGrid control that's basically a customized DataGrid . 我有一个GroupingGrid控件,它基本上是一个自定义的DataGrid I got the groupings to work from code-behind, by making my ViewModel expose a ListCollectionView , and have C# code to manually add the PropertyGroupDescription that tells the grid how to regroup things. 通过使我的ViewModel公开ListCollectionView ,并使用C#代码手动添加PropertyGroupDescription来告诉网格如何重新组合内容,我从分组后台开始工作。

I'd like to do that in plain XAML instead, like this: 我想在普通的XAML中这样做,就像这样:

<controls:GroupingGrid GroupedItemSource="{DynamicResource MyViewSource}"
                       SelectedItem="{Binding MySelectedItem}"
                       ShowGroupingItemCount="True">
    <DataGrid.Resources>
        <CollectionViewSource x:Key="MyViewSource" Source="{Binding ViewModel.MyData}">
            <CollectionViewSource.GroupDescriptions>
                <PropertyGroupDescription PropertyName="SomeProperty" 
                                          Converter="{StaticResource MyConverter}" />
            </CollectionViewSource.GroupDescriptions>
        </CollectionViewSource>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <!-- column definitions -->
    </DataGrid.Columns>

So I added this to my GroupingGrid control's code-behind: 所以我把它添加到我的GroupingGrid控件的代码隐藏中:

public static readonly DependencyProperty GroupedItemSourceProperty =
    DependencyProperty.Register("GroupedItemSource", typeof (CollectionViewSource), typeof (GroupingGrid));

public CollectionViewSource GroupedItemSource
{
    get { return (CollectionViewSource) GetValue(GroupedItemSourceProperty); }
    set { SetValue(GroupedItemSourceProperty, value); }
}

It builds, but I get a runtime XamlObjectWriterException saying: 它构建,但我得到一个运行时XamlObjectWriterException说:

Set property 'System.Windows.ResourceDictionary.DeferrableContent' threw an exception. 设置属性'System.Windows.ResourceDictionary.DeferrableContent'引发了异常。

So basically, I can't use DataGrid.Resources in the "client xaml" to add things like a CollectionViewSource.GroupDescriptions collection, because I cannot re-initialize resource dictionary instance . 所以基本上,我不能在“client xaml”中使用DataGrid.Resources来添加像CollectionViewSource.GroupDescriptions集合这样的东西,因为我无法重新初始化资源字典实例

Is my only hope to define the groupings in C# code, or there's a neat XAML way? 我唯一希望用C#代码定义分组,还是有一个简洁的XAML方式?

Add CollectionViewSource as Resource of Window/Usercontrol 添加CollectionViewSource作为Window/Usercontrol资源

<Window.Resources>
    <CollectionViewSource x:Key="MyViewSource" Source="{Binding ViewModel.MyData}">
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription PropertyName="SomeProperty" 
                                      Converter="{StaticResource MyConverter}" />
        </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>
</Window.Resources>

Bind it to your DataGrid as follows 将它绑定到DataGrid ,如下所示

<DataGrid ItemsSource="{Binding Source={StaticResource MyViewSource}}"
          SelectedItem="{Binding MySelectedItem}"/>

Hope this helps!! 希望这可以帮助!!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM