1

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

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

代码(简化版):

  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 框架中是否有任何东西可以解决此类问题。

更多信息:

对于这个应用程序性能是主要问题,因为我向集合中添加了许多项目。

更新:

usingFastObservableCollection解决了这个问题,但是一旦我停止使用,UI 就会冻结大约 5-7 秒。我的猜测是,这是由Dispatcher

我已经手动覆盖了OnCollectionChanged

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

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

4

1 回答 1

1

您可以考虑在 Catel 中使用FastObservableCollection

using (fastCollection.SuspendChangeNotifications())
{
    // TODO: Add and remove all your items here
}

一旦您退出使用,它将通过它的更改通知

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

于 2013-04-25T12:23:52.197 回答