2012-08-28 58 views
1

這是我遇到過的最奇怪的事情。在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,但它沒有奏效。

+0

1)它與其他ItemControls(列表框)工作的? –

+0

2)當用IList 替換IReadOnlyList 時會發生什麼情況? –

+0

它不能與其他ItemControls一起使用,並且使用IList 也無濟於事。我也嘗試用IEnumerable 而不是IReadOnlyList 而沒有。 – gjulianm

回答

1

您的收藏需要實施IList。我剛剛遇到了同樣的問題,我實施了在Windows Phone應用程序中運行良好的IList,但是當我試圖在Windows 8應用程序中使用視圖模型時,它不遵守更改的事件。

我加的IList的實現上我的課,現在一切都按預期

相關問題