正如标题所说,我正在尝试实现 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
}
}
我收到运行时错误,在 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);
}
}