2014-02-03 3 views
0

Я запустить анализ кода в Visual Studio и получил следующее предупреждение:C# свойство Коллекции должно быть прочитано только

CA2227: свойства Коллекции должны быть только для чтения.

Я знаю, что это значит и почему я не должен иметь публичный набор. Но я не уверен, как с этим бороться.

В моей ViewModel у меня есть это свойство:

private ObservableCollection<Foo> _foos = new ObservableCollection<Foo>(); 

public ObservableCollection<Foo> Foos 
{ 
    get { return _foos; } 
    set 
    { 
     _foos = value; 
     OnPropertyChanged(); 
    } 
} 

Это свойство привязывается к представлению.

Логика, как заполнить эту коллекцию, находится в бизнес-слое. Есть функция, которая возвращает

ObservableCollection<Foo> 

Если у Foos нет сеттера, я не могу этого сделать.

Foos = BusinessLayer.GetFoos(); 

Я могу это сделать:

_foos = BusinessLayer.GetFoos(); 
OnPropertyChanged("Foos"); 

или это:

var foos = BusinessLayer.GetFoos(); 
foreach(var foo in foos) 
{ 
    Foos.Add(foo); 
} 

Что является подходящим способом? Есть ли лучшие способы?

+0

Я согласен с тем, что свойства коллекции должны быть доступны только для чтения. Создавайте коллекцию один раз, изнутри своего класса. Затем обработайте его, а не с самой коллекцией. –

+2

BTW, ваш бизнес-уровень не должен возвращать ObservableCollections. Это концепция ViewModel, которая не имеет ничего общего с бизнес-логикой. –

ответ

1

Просто используйте

Foos.Clear(); 
Foos.AddRange(BusinessLayer.GetFoos()); 

Однако этот код теряет какие-либо обновления.

+0

"этот код теряет какие-либо обновления." А? Пока Foos является ObservableCollection, любой, кто связан с ним, будет видеть события обновления коллекции и должен реагировать соответствующим образом. Использование свойства INPC для отображения ObservableCollection является запахом кода. – Will

+0

Я имел в виду обновления от бизнес-уровня к модели представления - если кто-то изменяет 'BusinessLayer.GetFoos()', вам необходимо обновить коллекцию в модели просмотра самостоятельно. – Georg

+0

ObservableCollection не поддерживает AddRange – Dani

Смежные вопросы