Коллекция из БД в MVVM

229
16 декабря 2017, 04:19

Есть как я думаю стандартный подход к получению данных из БД.

public static class Core
{
public static IList<string> GetItems() => 
          (new BusinessContext()).GetAll<...>().Where(...).ToList();    
...
}

Во ViewModel имеем следующее:

private IList<string> _items;
public ICollectionView ItemsCollection {get; set;}
public void CONSTRUCTOR()
{
   _items = new List<string>();
   _items = Core.GetItems();
   ItemsCollection = CollectionViewSource.GetDefaultView(_items);
   ItemsCollection.Refresh();
}

Привязываем, и получаем список из БД в нашей View.

Однако, если сделать вот-так:

private string _foo;
public string Foo
{
  get { return _foo;}
  set { _foo = value; 
        NotifyProppertyChange();
        if (_foo != null)
        {
         _items.Clear();
         _items = Core.GetItems();
          ItemsCollection.Refresh();
        }
     }
}

Ничего во вью, не отображается, пока не заменим _items = Core.GetItems(); на

foreach( string item in Core.GetItems()) _items.Add(item);

Вопрос: почему в конструкторе срабатывает, а тут нет?

Answer 1

Ошибка в том, что вы в VM используете типы наподобие CollectionView. Это чисто вьюшные типы, которые вам не должны быть интересны.

Для того, чтобы обновление коллекции подхватывалось, вы должны использовать в VM коллекцию, реализующую INotifyCollectionChanged (не путайте с INotifyPropertyChanged). Например, ObservableCollection<string> для вашего случая.

READ ALSO
Остановка программы Tcp

Остановка программы Tcp

new Thread(new ThreadStart(new Testing_one()Init))

280
В Telegram из макроса VBA Excel?

В Telegram из макроса VBA Excel?

Подскажите пожалуйста есть форма в Excele (для записи заявок на сервис), очень много чего завязано на telegramЗаинтересовал вот подобный вариант...

562
YouTube эмуляция просмотров без WebBrowser C#

YouTube эмуляция просмотров без WebBrowser C#

Добрый деньВозник такой вопрос - возможно ли Post ,Get запросами cэмулировать просмотр ролика без браузера?Если это возможно хотя бы намекните...

230
Получить DateTime в формате ISO 8601

Получить DateTime в формате ISO 8601

Не думал что задам такой вопрос, но я действительно не могу найти решение отформатировать текущую дату в ISO 8601, отставив тип данных DateTime

268