2

これは私が今まで直面した中で最も奇妙なことです。Windows 8 MS では CollectionViewSource からフィルタリングと並べ替えが削除されたため、CollectionView<T>. CollectionViewtype の View プロパティがありますIObservableCollection<T>。これは、物事を抽象化するためだけに作成したカスタム インターフェイスです。その定義は非常に単純です

public interface IObservableCollection<T> : IReadOnlyList<T>, INotifyCollectionChanged
{
}

次に、このインターフェイスを実装する内部クラスがあります。

internal class FilteredSortedCollection<T> : IObservableCollection<T>
{
    public event NotifyCollectionChangedEventHandler CollectionChanged;

    public void RaiseCollectionChanged(NotifyCollectionChangedEventArgs args)
    {
        var copy = CollectionChanged;
        if (copy != null)
            copy(this, args);
    }

    public Func<IEnumerator<T>> RequestEnumerator { get; set; }
    public Func<int> RequestCount { get; set; }
    public Func<int, T> RequestItem { get; set; }

    public IEnumerator<T> GetEnumerator()
    {
        return RequestEnumerator();
    }

    public int Count { get { return RequestCount(); } }
    public T this[int index] { get { return RequestItem(index); } }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

ここまではうまくいきました。CollectionView は適切にフィルター処理して注文し、View は期待どおりに機能します。ListView.ItemsSource プロパティにバインドする場合を除いて、実装されていないかのように動作しますINotifyCollectionChanged。誰も CollectionChanged イベント (デバッガーでチェック) をリッスンせず、UI は新しい要素が追加されても更新されません。しかし、アイテムをいくつか追加してから ItemsSource プロパティを設定すると、UI が更新されます。あたかもそれが通常の観察不可能なリストであるかのように。

ここで何が起こっているのか知っている人はいますか?IObservableCollectionインターフェイスを削除しようとしたのでFilteredSortedCollection、実装IReadOnlyList<T>してINotifyCollectionChanged直接実行しましたが、機能しませんでした。

4

1 に答える 1

2

コレクションは IList を実装する必要があります。Windows Phone アプリでうまく機能する IList を実装したのと同じ問題に遭遇しましたが、Windows 8 アプリケーションのビュー モデルを使用しようとすると、変更されたイベントが反映されませんでした。

IList の実装をクラスに追加したところ、すべてが期待どおりに機能するようになりました

于 2012-12-28T21:52:59.493 に答える