MVVM - я должен выставить ReadOnlyObservableCollection, ReadOnlyCollection, ICollection и т. Д.? - PullRequest
4 голосов
/ 29 июля 2011

По сути, я всегда понимал, что вы должны возвращать базовые типы expose всякий раз, когда можете, и беспокоиться о деталях реализации внутри, что имеет смысл ...

Но я не уверен, что делатьделай здесьПо сути, сейчас у меня есть:

ReadOnlyObservableCollection<Foo> MyFoos {get; private set; }

Мне интересно, должно ли это быть возвращено как ReadOnlyCollection<Foo> или ICollection<Foo>, потому что внутренне я никогда не использую какие-либо наблюдаемые части или пытаюсь записать вколлекция.WPF, кажется, не волнует, что я возвращаю, он все еще связывает его и правильно запускает событие уведомления об изменении коллекции.Но я где-то читал, что мне нужно спроектировать это так, чтобы в моем ViewModel действительно работал любой потребляющий вид.

Так что я немного растерян.Я думаю, что оставляя его как ReadOnlyObservableCollection<T>, имеет смысл явно указать потребляющему представлению, что они могут и не могут сделать со свойством, но у меня также сложилось впечатление, что вы должны уменьшить количество типов до их основы.типы, когда вы можете.Так что я не уверен, что здесь делать.Особенно учитывая тот факт, что WPF не волнует, какой тип я возвращаю, он обнаруживает, что его можно наблюдать.

Ответы [ 2 ]

8 голосов
/ 29 июля 2011

Я бы, вероятно, оставил его как ReadOnlyObservableCollection, потому что в нем очень четко указано, что может делать потребитель вашей ViewModel с вашей коллекцией.Также обратите внимание, что WPF на самом деле не привязывается напрямую к вашей коллекции, он привязывается к возвращаемому значению CollectionViewSource.GetDefaultView , которое возвращает ICollectionView.ICollectionView имеет INotifyCollectionChanged в своем контракте.

2 голосов
/ 29 июля 2011

С точки зрения производительности вы хотели бы по крайней мере использовать источник элементов в качестве коллекции, которая реализует INotifyCollectionChanged . MVVM предоставляет много преимуществ, но в первую очередь занимается модульным тестированием и разделением задач, поэтому выбор будет основываться на ReadOnlyObservableCollection или на интерфейсе, подобном ICollection {T} на ваших целях модульного тестирования.

...