Только для чтения наблюдаемая коллекция - PullRequest
5 голосов
/ 19 мая 2010

У меня есть класс, у которого есть внутренняя наблюдаемая коллекция. Я хочу передать эти данные пользователю класса через функцию.

Я не хочу, чтобы они могли изменять объекты внутри наблюдаемой коллекции или самой коллекции.

Каков наилучший способ повысить производительность и простоту использования?

Ответы [ 3 ]

5 голосов
/ 19 мая 2010

Возможно, используя это: ReadOnlyObservableCollection<T>. Обратите внимание, что вам придется написать свои собственные обертки только для чтения для ваших объектов, поскольку ReadOnlyObservableCollection<T> запрещает только обновления самой коллекции.

2 голосов
/ 18 марта 2013

Мне не нравится использовать 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>(),
            };
    }
}
1 голос
/ 10 августа 2011

Что я сделал для этого типа реализации, так это чтобы у меня был общий класс с базовым списком BindingList для всей клиентской стороны. Был общедоступный метод чтения только для чтения, и в фактическом представителе пользовательского интерфейса я включил тип фильтрованного списка (привязанный к базовому синглтону при создании экземпляра), который позволил бы представлению клиента применить фильтр выражений (LINQ также включен, основываясь на базовом T) и с помощью элементов управления пользовательского интерфейса, привязанных к этому отфильтрованному списку, изменения списка будут автоматически поддерживать обновление пользовательского интерфейса, только если оно прошло фильтр. И это было только для чтения, потому что серверная сторона публиковала обновления для всего класса контроллера WCF, который передавал их на уровень List, полностью пропуская пользовательский интерфейс.

...