ObservableCollection 元素的自动换行

问题描述 投票:0回答:1

正如标题所说,我正在尝试实现 ObservableCollection 项目的自动包装,目前我正在使用 CollectionChanged 事件来执行此操作,其中我检查元素是否为必需类型,如果不是,我创建此类型的对象(即一个容器),将元素移动到其中并尝试用包装器替换集合中的当前元素,但在这里我收到运行时错误,即 ObservableCollection 在 CollectionChanged 事件期间无法修改,所以,我的问题是,如何实现自动包装? 这是示例代码:

[ContentProperty("Items")]
public partial class BaseUserControl : UserControl
{
    public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register("Items",
        typeof(ObservableCollection<FrameworkElement>), typeof(BaseUserControl));
    public ObservableCollection<FrameworkElement> Items
    {
        get { return (ObservableCollection<FrameworkElement>)GetValue(ItemsProperty); }
        set { SetValue(ItemsProperty, value); }
    }

    public BaseUserControl()
    {
        InitializeComponent();

        Items.CollectionChanged += Items_CollectionChanged;
    }

    private void Items_CollectionChanged(object? sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        for (int i = 0; i <  Items.Count; i++)
        {
            if (Items[i] is not WrapperUserControl)
            {
                WrapperUserControl wrapper = new WrapperUserControl();
                wrapper.Items.Add(Items[i]);
                Items[i] = wrapper;
                return;
            }
        }

        // do something else
    }
}
c# wpf observablecollection
1个回答
0
投票

我收到运行时错误,在 CollectionChanged 事件期间无法修改 ObservableCollection

仅当多个处理程序正在侦听

CollectionChanged
事件时才会发生此错误,因此如果可能,请不要公开
ObservableCollection
属性。您可以将
CollectionChanged
事件封装到所需的侦听器。

public partial class BaseUserControl : UserControl
{
    ....
    public ObservableCollection<FrameworkElement> Items
    {
        // get { return (ObservableCollection<FrameworkElement>)GetValue(ItemsProperty); }
        set { SetValue(ItemsProperty, value); }
    }

    public event NotifyCollectionChangedEventHandler? CollectionChanged;

    ....

    private void Items_CollectionChanged(object? sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        ....
        CollectionChanged?.Invoke(sender, e);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.