简体   繁体   中英

How to change WPF CollectionViewGroup type to custom type and use it in ListCollectionView

How can override the type of View property to my custom type. My CustomGroupListCollectionView type adds extra property to the Groups property. During runtime when i observe the type of View property is ListCollectionView, i want to change this to 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; }
    }
} 

CollectionViewSource has a CollectionViewType property, which you can use to determine the type of CollectionView the CollectionViewSource returns, like

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

As you see, you don't even have to create a new CollectionViewSource class.

If you still persist on using your way I would suggest this code:

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

        this.CollectionViewType = typeof(CustomGroupListCollectionView);

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

Hope it helps.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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