2010-05-19 16 views
5

Mam moją klasę, która ma wewnętrzną obserwowalną kolekcję. Chcę przekazać dane w ten sposób do użytkownika klasy za pomocą funkcji.Tylko do odczytu obserwowalna kolekcja

Nie chcę, aby były w stanie zmienić obiekty wewnątrz obserwowalnej kolekcji lub samej kolekcji.

Jaki jest najlepszy sposób na wykonanie tej funkcji i łatwość użycia?

Odpowiedz

5

Prawdopodobnie używa się tego: ReadOnlyObservableCollection<T>. Zauważ, że będziesz musiał napisać własne wrappery tylko do odczytu dla twoich obiektów, ponieważ ReadOnlyObservableCollection<T> tylko zapobiega aktualizacji samej kolekcji.

1

To, co zrobiłem dla tego typu implementacji, to mieć wspólną klasę z bazową listą powiązań, która ma służyć całemu klientowi. Był publicznie pobierany tylko do odczytu, a w aktualnym prezentatorze UI zawierałem typ listy filtrowanej (związany z podstawowym singletonem na wystąpienie), który pozwoliłby klientowi na zastosowanie filtru wyrażeń (LINQ również włączony, w oparciu o bazowe T) i, wraz z UI kontroluje databundę do tej przefiltrowanej listy, zmiany na liście automatycznie wspierają aktualizację UI tylko wtedy, gdy przekażą filtr. I to było tylko do odczytu, ponieważ strona serwera publikowała aktualizacje do ogólnej klasy kontrolera WCF, która przekazała je do warstwy List, całkowicie pomijając interfejs użytkownika.

+0

Witamy Stackoverflow i gratulacje na swojej pierwszej odpowiedzi. Spróbuj go zrozumieć - np. przez formatowanie (kod, oddzielne akapity lub style listy). Może przykład pomoże? – Mateng

1

Nie lubię używać numeru ReadOnlyObservableCollection<T>, ponieważ wygląda na pomyłkę/zepsutą klasę; Zamiast tego wolę podejście oparte na umowach.

Oto co używam, która pozwala na covarience:

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>(), 
      }; 
    } 
} 
Powiązane problemy