2010-05-19 188 views
5

我有我的班級有一個內部可觀察集合。我想通過一個函數將這個數據傳遞給這個類的用戶。只讀可觀察集合

我不希望他們能夠更改可觀察集合或集合本身內部的對象。

什麼是最好的方式來做這種性能和易用性明智?

回答

5

可能使用此:ReadOnlyObservableCollection<T>。請注意,由於ReadOnlyObservableCollection<T>只能阻止對集合本身的更新,因此您必須爲自己的對象編寫自己的只讀封裝器。

1

我對這種類型的實現做了什麼,是爲了讓整個客戶端使用一個帶有底層BindingList的共享類。有一個公共readonly getter,並且在實際的UI展示器中,我包含了一種過濾列表(綁定到實例化的底層單例),這將允許客戶端視圖應用表達式過濾器(基於底層T,也啓用LINQ)並且,通過UI將數據綁定到此過濾列表,列表更改只有在它通過過濾器時纔會自動支持UI更新。它只是只讀的,因爲服務器端發佈更新到整個WCF控制器類,並將它們傳遞給List層,完全跳過UI。

+0

歡迎和#1恭喜您的第一個答案。請儘量讓它更易於理解 - 例如通過格式化(代碼,單獨的段落或列表樣式)。也許一個例子會有所幫助? – Mateng 2012-11-14 23:02:51

1

我不喜歡使用ReadOnlyObservableCollection<T>,因爲它看起來像一個錯誤/破碎的類;我更喜歡基於合同的方法。

以下是我使用允許的協變性:

public interface INotifyCollection<T> : ICollection<T>, INotifyCollectionChanged 
{ 
} 

public interface IReadOnlyNotifyCollection<out T> : IReadOnlyCollection<T>, INotifyCollectionChanged 
{ 
} 

public class NotifyCollection<T> : ObservableCollection<T>, INotifyCollection<T>, IReadOnlyNotifyCollection<T> 
{ 
} 

public class Program 
{ 
    private static void Main(string[] args) 
    { 
     var full = new NotifyCollection<string>(); 
     var readOnlyAccess = (IReadOnlyCollection<string>) full; 
     var readOnlyNotifyOfChange1 = (IReadOnlyNotifyCollection<string>) full; 

     //Covarience 
     var readOnlyListWithChanges = new List<IReadOnlyNotifyCollection<object>>() 
      { 
       new NotifyCollection<object>(), 
       new NotifyCollection<string>(), 
      }; 
    } 
}