これは私が今まで直面した中で最も奇妙なことです。Windows 8 MS では CollectionViewSource からフィルタリングと並べ替えが削除されたため、CollectionView<T>
. CollectionView
type の 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
直接実行しましたが、機能しませんでした。