這是我遇到過的最奇怪的事情。在Windows 8中,MS從CollectionViewSource中刪除了過濾和排序,但我不得不自己創建,名爲CollectionView<T>
。 CollectionView
有一個類型爲IObservableCollection<T>
的View屬性,這是我爲保持事物抽象而做出的自定義界面。它的定義很簡單爲什麼沒有ItemsSource綁定到我的自定義CollectionChanged事件
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正確過濾和訂購,並且該視圖按預期工作。除了當我將它綁定到一個ListView.ItemsSource屬性它只是表現得好像它沒有實現INotifyCollectionChanged
。沒有人收聽CollectionChanged事件(使用調試器進行檢查)並且UI不會使用添加的新元素更新。但是,如果我添加一些項目,然後設置ItemsSource屬性,UI更新。就好像它是一個正常的,不可觀察的清單。
有人知道這裏會發生什麼嗎?我嘗試刪除IObservableCollection
接口,因此FilteredSortedCollection
剛剛直接實施了IReadOnlyList<T>
和INotifyCollectionChanged
,但它沒有奏效。
1)它與其他ItemControls(列表框)工作的? –
2)當用IList替換IReadOnlyList 時會發生什麼情況? –
它不能與其他ItemControls一起使用,並且使用IList也無濟於事。我也嘗試用IEnumerable 而不是IReadOnlyList 而沒有。 –
gjulianm