3

自分の子孫にメソッドObservableCollectionをサポートしてもらいたい。AddRangeこれが私が現在持っているものです:

public class ObservableCollectionPlus<T> : ObservableCollection<T>
{
    public void InsertRange(IEnumerable<T> items)
    {
        this.CheckReentrancy();
        foreach (var item in items) Items.Add(item);

        var type = NotifyCollectionChangedAction.Reset;
        var colChanged = new NotifyCollectionChangedEventArgs(type);
        var countChanged = new PropertyChangedEventArgs("Count");

        OnPropertyChanged(countChanged);
        OnCollectionChanged(colChanged);
    }
}

私はここで何が起こっているのか、そしてなぜこれらのイベントが発生するのかについてはあまり知りません。これは、グーグルとスタックオーバーフローについていくつかの調査を行った後に私が組み立てた解決策です。

ここで、クラスのインスタンスをバインドして、をLongListSelector介しInsertRangeてアイテムを動的に追加した後、バインドされたのスクロール位置がその一番上に送信されます。ObservableCollectionPlusLongListSelector

この標準的な方法でアイテムを追加すると、foreach (var item in items) collection.Add(item);LongListSelector位置はシフトされません。しかしもちろん、この方法では、望ましくないDataBinding通知のオーバーヘッドが発生します。

どうやら、私の現在のソリューションで何かが間違っています。InsertRangeまったく同じように動作するがforeach (var item in items) collection.Add(item);、DataBinding通知を1回だけ起動し、バインドされたオブジェクトのスクロール位置に奇妙なことをしないように実装するにはどうすればよいですか?

4

4 に答える 4

3

NotifyCollectionChangedAction.Resetそれはあなたが通知を送信したからかもしれませんが、おそらくNotifyCollectionChangedAction.Addうまくいくでしょう:)

public class ObservableRangeCollection<T> : ObservableCollection<T>
{
    public void AddRange(IEnumerable<T> collection)
    {
        foreach (var i in collection)
        {
            Items.Add(i);
        }
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, collection.ToList()));
    }
}
于 2013-01-29T21:16:12.447 に答える
2

最近プロジェクトでこれを使用しました...

public class RangeObservableCollection<T> : ObservableCollection<T>
{
    private bool _suppressNotification = false;

    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        if (!_suppressNotification)
            base.OnCollectionChanged(e);
    }

    public void AddRange(IEnumerable<T> list)
    {
        if (list == null)
            throw new ArgumentNullException("list");

        _suppressNotification = true;

        foreach (T item in list)
        {
            Add(item);
        }
        _suppressNotification = false;
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
    }
}
于 2013-01-30T08:49:33.370 に答える
-1

問題は常に NotifyCollectionChangedEventArgs ctor に渡す引数にありました。アクションに応じて、さまざまな引数を取るさまざまな ctor が多数あります。以下は最終的に私にとってうまくいくようです: https://github.com/lolluslollus/Utilz/blob/master/Utilz/SwitchableObservableCollection.cs

于 2016-02-09T23:07:34.173 に答える