通过属性网格编辑可观察集合

11 浏览
0 Comments

通过属性网格编辑可观察集合

我有一个类,其中包含一个可观察集合属性,并且我使用PropertyGrid编辑此属性。当我从中删除一些项目并按下OK按钮时,我的集合开始触发CollectionChanged事件,但它不会触发带有Remove操作的事件。

首先,它会触发一个带有Reset操作的事件,然后再触发其余项目的Add操作事件。

我如何知道何时集合会触发最后一个CollectionChanged事件?

我如何知道哪些项目已被删除?

0
0 Comments

问题的原因是,当使用属性网格编辑可观察集合时,有可能出现问题,因为属性网格在编辑集合时无法及时更新相关数据。解决方法是使用一个本地计时器,在集合发生变化时启动计时器,并在一定时间间隔后检查集合中的项目是否被删除,并清理与之绑定的数据。

private ObservableCollection _items;
private List _itemIds;
public ObservableCollection Items
{
    get { return _items; }
    set
    {
        if (_items != null)
        {
            _items.CollectionChanged -= Items_CollectionChanged;
        }
        _items = value;
        _items.CollectionChanged += Items_CollectionChanged;
        // Update local copy of item IDs
        _itemIds = new List(_items.Select(i => i.Id));
    }
}
private void Items_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    // Start local timer with a certain interval (e.g. 500ms)
    Timer timer = new Timer(500);
    timer.Elapsed += Timer_Elapsed;
    timer.Start();
}
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
    Timer timer = (Timer)sender;
    timer.Stop();
    timer.Elapsed -= Timer_Elapsed;
    // Check which items were removed from the collection
    List removedItemIds = _itemIds.Except(_items.Select(i => i.Id)).ToList();
    // Clean up data bound to the removed items
    foreach (int itemId in removedItemIds)
    {
        // Clean up data for item with ID = itemId
    }
}

这个解决方法使用一个本地计时器来延迟处理集合变化事件,以给属性网格足够的时间来更新相关数据。在集合变化事件触发时,启动计时器,并在一定时间间隔后检查集合中的项目是否被删除。通过比较本地副本中的项目ID和集合中的项目ID,可以确定哪些项目被删除,并进行相应的数据清理操作。这样可以确保在编辑可观察集合时,相关数据能够及时更新和清理。

0