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 
    }

  }
}

今まで、.NET 4.5 でのみ使用できるBindingOperations.EnableCollectionSynchronizationを使用してきました。残念ながら、.Net 4 を使用してコードをコンパイルする必要があります。

私は知りたいのですが、この種の問題を解決する Catel フレームワークには何かありますか?

より詳しい情報:

このアプリケーションの場合 コレクションに多くの項目を追加するので、パフォーマンスが主な問題です。

アップデート:

を使用FastObservableCollectionすると問題は解決しますが、使用をやめるとすぐに 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 に答える