Catel (MVVM framework) ObservableCollection

本文关键字:ObservableCollection framework MVVM Catel | 更新日期: 2023-09-27 18:10:47

我正在使用Catel实现一个WPF应用程序。

我有一个从ObservableCollection扩展的类,每次插入一个项目时,UI必须更新。

CODE (简化版):

  public abstract class LogCollections : ObservableCollection<Log4NetLog>  {
    private readonly Object _locker;
    protected LogCollections() {
        _logChart = new LoggingLevelChart();
        _locker = new object();
    }
    public object Locker {
        get { return _locker; }

    protected override void InsertItem(int index, Log4NetLog item) {
        lock (_locker) {
            base.InsertItem(index, item);
            if (item == null) {
                return;
            }
            Log4NetLog temp = item as Log4NetLog;
            // Updating
            if (temp != null) {
                // Updating
            }
        } //UnLock 
    }
  }
}

直到现在我一直使用BindingOperations。EnableCollectionSynchronization只在。net 4.5中可用。不幸的是,我不得不使用。net 4来编译代码。

我想知道,在Catel框架中是否有解决这类问题的方法。

更多信息:

For This Application性能是主要问题,因为我向集合中添加了许多item。

更新:

使用FastObservableCollection解决了这个问题,然而,当我退出使用时,UI冻结了大约5-7秒。我猜,这是由Dispatcher

引起的。

我已经手动覆盖了OnCollectionChanged:

protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) {
  DispatcherHelper.CurrentDispatcher.BeginInvoke(new Action(() => base.OnCollectionChanged(e)),
              DispatcherPriority.ContextIdle);
}

这不是一个好的解决方案。有没有更好的方法来避免这个问题?

Catel (MVVM framework) ObservableCollection

你可以考虑在Catel:

中使用FastObservableCollection。
using (fastCollection.SuspendChangeNotifications())
{
    // TODO: Add and remove all your items here
}

一旦你退出使用,它就会传递它的更改通知

要解决线程问题,可以使用DispatcherHelper