如何在 XAML 中为自定义数据网格控件指定组说明

本文关键字:控件 网格 说明 数据网 数据 XAML 自定义 | 更新日期: 2023-09-27 18:34:31

我有一个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"引发了异常。

所以基本上,我不能在"客户端 xaml"中使用DataGrid.Resources来添加CollectionViewSource.GroupDescriptions集合之类的东西,因为我无法重新初始化资源字典实例

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

如何在 XAML 中为自定义数据网格控件指定组说明

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}"/>

希望这有帮助!!