2010-05-19 18 views
5

Tengo mi clase que tiene una colección interna observable. Quiero pasar los datos en esto a un usuario de la clase a través de una función.Solo lectura colección observable

No quiero que puedan cambiar los objetos dentro de la colección observable o la colección en sí.

¿Cuál es la mejor manera de hacer este rendimiento y facilidad de uso?

Respuesta

5

Probablemente usando esto: ReadOnlyObservableCollection<T>. Tenga en cuenta que tendrá que escribir sus propios contenedores de solo lectura para sus objetos, ya que el ReadOnlyObservableCollection<T> solo impide las actualizaciones de la colección.

1

Lo que hice para este tipo de Implementación fue tener una clase compartida con un BindingList subyacente, para que lo use todo el lado del cliente. Había un getter público, y en el presentador real de UI incluí un tipo de lista filtrada (enlazada al singleton subyacente en la instanciación) que permitiría a la vista del cliente aplicar un filtro de expresión (LINQ habilitado también, basado en T subyacente) y, con los controles de la interfaz de usuario enlazados a esta lista filtrada, los cambios en la lista respaldarían automáticamente la actualización de la interfaz de usuario solo si pasó el filtro. Y fue de solo lectura, porque el lado del servidor publicaba las actualizaciones de una clase de controlador WCF global que pasaba a la capa Lista, salteando la UI por completo.

+0

Bienvenido a Stackoverflow y felicidades a su primera respuesta. Intente que sea más fácil de comprender, por ejemplo, formateando (Código, párrafos separados o estilos de lista). Tal vez un ejemplo ayudaría? – Mateng

1

No me gusta usar ReadOnlyObservableCollection<T> ya que parece un error/clase rota; Prefiero un enfoque basado en contrato en su lugar.

Esto es lo que yo uso que permite 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>(), 
      }; 
    } 
} 
Cuestiones relacionadas