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

时间:2016-02-15 01:08:08

标签: c# wpf xaml

我有GroupingGrid控件基本上是自定义DataGrid。通过让我的ViewModel公开ListCollectionView,并使用C#代码手动添加PropertyGroupDescription告诉网格如何重新组合内容,我让代码从代码隐藏中工作。

我想在普通的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>

所以我将此添加到我的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); }
}

它构建,但我得到一个运行时XamlObjectWriterException说:

  

设置属性'System.Windows.ResourceDictionary.DeferrableContent'抛出异常。

基本上,我不能在“client xaml”中使用DataGrid.Resources来添加类似CollectionViewSource.GroupDescriptions集合的内容,因为我无法重新初始化资源字典实例

我唯一希望用C#代码定义分组,还是有一种简洁的XAML方式?

1 个答案:

答案 0 :(得分:2)

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>

将其绑定到DataGrid,如下所示

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

希望这会有所帮助!!