6

ItemsSourceをViewModelインスタンスのObeservableCollectionにバインドする(仮想化されていない)ItemsControlがあります。ここで、大量のModelインスタンスがロードされたら、すべてのViewModelコンポーネントをそのObservableCollectionに追加する必要があります。UIスレッドをハングさせずに大量のViewModelを追加するにはどうすればよいですか?

新しいアイテムが追加されるたびにItemsControlがそれ自体を更新する必要があり、レイアウトなどを何度も繰り返すため、UIスレッドがハングすると思います。

  • バインディングを一時停止してすべてのアイテムを追加してから再開する必要がありますか?もしそうなら、どのように?
  • ObservableCollectionをオーバーライドしてAddRangeを実装し、複数のアイテムを追加するために1つのCollectionChangedイベントのみが発生するようにする必要がありますか?または、コレクション全体を置き換えるだけですか?
  • または、各アイテムを個別に追加してDispatcher.Invokeを個別に呼び出す方がよいでしょうか。だから私は頻繁にブロックを解除します。

仮想化できない大きな動的リストをどのように処理しますか?

4

2 に答える 2

10

ObservableCollectionから派生したクラスを作成できます。これにより、次のようにCollectionChangedイベントを一時的に中断できます。

public class SuspendableObservableCollection : ObservableCollection
{
    private bool suspended;

    public bool Suspended 
    {
        get
        {
            return this.suspended;
        }
        set
        {
            this.suspended = value;
            OnCollectionChanged(new NotifyCollectionChangedEventArgs(
                NotifyCollectionChangedAction.Reset));
        }
    }

    protected override void OnCollectionChanged(
        NotifyCollectionChangedEventArgs args)
    {
       if (!Suspended)
       {
           base.OnCollectionChanged(args);
       }
    }
}
于 2010-03-17T11:54:16.857 に答える
0
<ItemsControl IsAsync="True" ... />
于 2010-10-06T18:33:14.440 に答える