2010-05-19 19 views
5

Ho la mia classe che ha una collezione interna osservabile. Voglio passare i dati in questo a un utente della classe tramite una funzione.Leggi solo collezione osservabile

Non voglio che siano in grado di modificare gli oggetti all'interno della collezione osservabile o la raccolta stessa.

Qual è il modo migliore per eseguire queste prestazioni e facilità d'uso?

risposta

5

Probabilmente utilizzando questo: ReadOnlyObservableCollection<T>. Nota che dovrai scrivere i tuoi wrapper di sola lettura per i tuoi oggetti, dal momento che lo impedisce solo gli aggiornamenti alla raccolta stessa.

1

Quello che ho fatto per questo tipo di implementazione era di avere una classe condivisa con un BindingList sottostante, per l'intero lato client da utilizzare. C'era un pubblico getter di sola lettura e nel presentatore dell'interfaccia utente effettivo includevo un tipo di Elenco filtrato (vincolato al singleton sottostante nell'istanziazione) che avrebbe consentito alla vista client di applicare un filtro di espressione (anche LINQ abilitato, basato sulla T sottostante) e, con l'interfaccia utente controlla il database per questo elenco filtrato, le modifiche dell'elenco supportano automaticamente l'aggiornamento dell'interfaccia utente solo se ha passato il filtro. Ed è stato readonly, perché il lato server stava pubblicando aggiornamenti su una classe di controller WCF generale che li ha passati al livello List, saltando completamente l'interfaccia utente.

+0

Benvenuti a StackOverflow e complimenti per la tua prima risposta. Per favore cerca di renderlo più facile da capire - ad es. formattando (Codice, paragrafi separati o stili di lista). Forse un esempio potrebbe aiutare? – Mateng

1

Non mi piace usare ReadOnlyObservableCollection<T> come sembra un errore/classe rotta; Preferisco invece un approccio basato sul contratto.

Ecco quello che uso che permette di 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>(), 
      }; 
    } 
}