0

Добрый день у меня есть контекст Library, таблица Books. С помощью метода Load() я загружаю в Local данные и потом local привязываю к datagrid. Как мне организовать постепенную подгрузку из базы данных. То есть при запуске в кэш грузится вся таблица, и только когда она догрузится datagrid приступит к отображению, что при 15 тысяч записей очень долго. Если плохо объяснил есть проект на GitHub, критика по поводу других аспектов проекта приветствуется. https://github.com/flash1371/DigitalLibrary

  • А можно один маленький вопрос, чисто ради своего любопытства... Я так понимаю вы студент, вас учили MVVM или вы сами решили по нему писать все? – EvgeniyZ Jun 22 '18 at 21:06
  • Сам решил, я не уверен, что нормально реализовал, но мне интересно было хотя бы попробовать – flash1371 Jun 22 '18 at 21:12
  • Вы знаете в чем суть MVVM паттерна? Ну, основная.. – EvgeniyZ Jun 22 '18 at 21:13
  • Отделение логики от представления. Если накосячил сразу скажите в чём ошибка – flash1371 Jun 22 '18 at 21:17
  • Именно, отделение. Все разделяется на 3 слоя - Model, ViewModel и View. О View не должен знать не один кусочек кода, он должен быть независим. А теперь смотрим ваш код: тут вы передаете MainWindow в ViewModel, а тут допустим вы берете дочерние элементы во View, в UniformGrid. Вот уберите все Name="..." с кода, запустится ли приложение? Нет, а должно. По этому у вас MVVM вообще нет. – EvgeniyZ Jun 22 '18 at 21:23
  • Спасибо, буду исправлять – flash1371 Jun 22 '18 at 21:26
  • https://metanit.com/sharp/wpf/pics/22.1.png На этом ресурсе View и ViewModel связаны друг с другом, и получается о View знает ViewModel или я не так понял? – flash1371 Jun 22 '18 at 21:28
  • Что касается "подгрузки", то тут у вас не должно браться 15 тысяч записей с базы, для таких целей делают пагинацию (страницы), то есть страница 1 - list.Skip(0).Take(15);; страница 2 - list.Skip(15).Take(15); ну и так далее. Вы хоть раз видели нормальный сайт/приложение, которое выводит больше скажем 100 значений? Я лично нет... – EvgeniyZ Jun 22 '18 at 21:29
  • Обновление данных имеется - это методами привязок, которые оповещают интерфейс об измененных данных в коллекции. Из кода связи не какой нет (ну кроме DataContext и то, он должен быть на уровне выше, в App к примеру, до инициализации View.). – EvgeniyZ Jun 22 '18 at 21:31
  • Я исправил, вроде как по паттерну, но что-то мне подсказывает что я нагромоздил лишнего – flash1371 Jun 24 '18 at 18:25
  • Прошелся бегло по изменениям, ну что же... Уже намного лучше! Пару замечаний. 1. Вы все реализовали по принципу DependencyProperty - данный подход хорош в UserControl или подобных местах, у вас же обычная ViewModel, где достаточно будет обычного свойства, ну и реализация INPC там, где требуется. 2. По принятым чтоль стандартам каждая VM, M должна заниматься своей определенной задачей. У вас все в одном месте, и студенты, и библиотека, это лучше разделять по разным классам и по своей VM. – EvgeniyZ Jun 24 '18 at 18:49
  • Click у кнопок - по сути, это допустимо, но это частичная реализация MVVM, полный же MVVM должен состоять из команд (ICommand). Ну и 4. Не помню говорил ли, но DataContext не очень хорошо задавать в самой View, ибо таким образом она становиться зависима от определенной VM. Честно, тут и сам толком не разобрался что да как, но по сути это должно быть на уровне выше, скажем в App классе, до показа самого окна.
  • – EvgeniyZ Jun 24 '18 at 18:49
  • Спасибо, всё понял, кроме момента "достаточно будет обычного свойства", не могли бы вы скинуть пример – flash1371 Jun 24 '18 at 19:17
  • Да любой мой ответ возьмите по WPF) К примеру, вот - В CheckBoxModel реализуются обычные свойства, допустим public string Name { get; set; }, но, оно не будет оповещать View об изменении из ViewModel, по этому надо реализовать INotifyPropertyChanged - создаем для удобства класс, наследуем нашу VM от него и переписываем свойство так, как к примеру реализован public bool IsChecked. – EvgeniyZ Jun 24 '18 at 19:24
  • Теперь понял. То что вы так подробно описываете решение и проблемы вызывает только уважение. И ещё раз спасибо – flash1371 Jun 24 '18 at 19:35
  • Да на здоровье, удачи в изучении ;-) – EvgeniyZ Jun 24 '18 at 19:35