如何将WPF CollectionViewGroup类型更改为自定义类型并在ListCollectionView中使用

3

如何覆盖View属性的类型为我的自定义类型。 我的CustomGroupListCollectionView类型为Groups属性添加额外的属性。 在运行时,当我观察到View属性的类型为ListCollectionView时,我想将其更改为CustomGroupListCollectionView。

public class CollectionViewSourceCustom : CollectionViewSource
{
    public new  CustomGroupListCollectionView View { get; set; }
}

public class CustomGroupListCollectionView : ListCollectionView
{
    private readonly CustomGroup _allGroup;

    public CustomGroupListCollectionView(IList list)
        : base(list)
    {
        _allGroup = new CustomGroup("All");
        foreach (var item in list)
        {
            _allGroup.AddItem(item);
        }
    }

    public override ReadOnlyObservableCollection<object> Groups
    {
        get
        {
            var group = new ObservableCollection<object>(base.Groups.ToList());
            group.Add(_allGroup);
            return new ReadOnlyObservableCollection<object>(group);
        }
    }
}

public class CustomGroup : CollectionViewGroup
{
    public CustomGroup(object name)
        : base(name)
    {
    }

    public void AddItem(object item)
    {
        ProtectedItems.Add(item);
    }

    public override bool IsBottomLevel
    {
        get { return true; }
    }

    bool _IsChecked;
    public bool IsChecked
    {
        get { return _IsChecked; }
        set { _IsChecked = value; }
    }
    Visibility _CheckBoxVisibility;
    public Visibility CheckBoxVisibility
    {
        get { return _CheckBoxVisibility; }
        set { _CheckBoxVisibility = value; }
    }

    bool _IsExpanded;
    public bool IsExpanded
    {
        get { return _IsExpanded; }
        set { _IsExpanded = value; }
    }
    Visibility _ExpanderVisibility;
    public Visibility ExpanderVisibility
    {
        get { return _ExpanderVisibility; }
        set { _ExpanderVisibility = value; }
    }

    Visibility _ImageVisibility = Visibility.Collapsed;
    public Visibility ImageVisibility
    {
        get { return _ImageVisibility; }
        set { _ImageVisibility = value; }
    }
} 
2个回答

5

CollectionViewSource有一个CollectionViewType属性,您可以使用它来确定CollectionViewSource返回的CollectionView类型,如下所示:

<CollectionViewSource x:Key="source" CollectionViewType="{x:Type my:CustomGroupListCollectionView}" Source="{Binding MyData}"/>

正如您所见,您甚至不必创建一个新的CollectionViewSource类。


在运行时,当我将新类型指定给 this.GroupByView.CollectionViewType 时,会出现“CollectionViewType 属性只能在初始化期间设置”的错误。 - Alex David
这条消息意味着您只能在 XAML 中或在 Initialized 事件触发之前设置 CollectionViewType 属性;也就是在 initializecomponent 调用之前的构造函数中。 - hbarck

2

如果您仍然坚持使用自己的方法,我建议使用以下代码:

public class CollectionViewSourceCustom : CollectionViewSource
{
    public CollectionViewSourceCustom()
        : base()
    {
        ((ISupportInitialize)this).BeginInit();

        this.CollectionViewType = typeof(CustomGroupListCollectionView);

        ((ISupportInitialize)this).EndInit();
    }
}

希望能对您有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接