Имеется WPF MVVM приложение, отображающее геометрические фигуры (Shape) внутри полотна (Canvas).
Упрощенная версия для простоты изложения:
Модель:
class Canvas
{
public List
class Shape
{
public int X;
public int Y;
}
Имеется несколько ViewModel'ей, некоторые из них отображают данные выбранной фигуры (фигура выбирается по клику на фигуру), некоторые - данные выбранного Canvas'а (выбирается с помощью комбобокса в ToolbarView), некоторые - и то и другое.
Т.о. имеется CanvasViewModel, CanvasPropertiesViewModel, ShapePropertiesViewModel , ToolbarViewModel.
ToolbarViewModel, CanvasViewModel и CanvasPropertiesViewModel связаны с текущим Canvas'ом.
ToolbarViewModel и ShapePropertiesViewModel связаны с выбранной фигурой.
ToolbarView, связанный с ToolbarViewModel, отображает большой плоский список названий всех canvas'ов.
Вопрос 1: как шарить между ViewModel'ми выбранную фигуру и выбранный canvas?
Пробовал через EventAggregator, но получается слишком много регистраций сообщений, код становится не читаемый.
Вопрос 2: Кто должен отвечать за загрузку данных с сервера о canvas и его сохранение? И где лучше разместить эту логику (может как-то использовать Repository)? (имеется сторонний web сервис, который отдает и сохраняет данные о canvas)
Ответ
Во-первых, если Canvas ещё как-то оправдано, то ToolbarViewModel — никак. Тулбар — это подробность View, а смысл этой VM — корневые параметры отображения.
Таким образом, у нас получается class RootVM с ReadOnlyCollection
Затем, я бы слил вместе CanvasViewModel и CanvasPropertiesViewModel, вроде бы они отвечают за одну и ту же сущность.
Давайте посмотрим, кому из ваших VM реально нужен CurrentCanvas. ToolbarViewModel содержит его. CanvasViewModel существует на каждый канвас, и знать о CurrentCanvas вовсе не должна. И CanvasPropertiesViewModel мы слили с CanvasViewModel
Проблема исчезла!
Теперь, о загрузке/выгрузке с сервера. За это отвечают модельные объекты (по классу на Canvas и фигуру). Решение о загрузке-выгрузке принимает в любом случае бизнес-логика, так что это она должна командовать модели произвести обмен информацией. Ну и на VM лежит ответственность за синхронизацию данных с моделью.
Не бойтесь, чтобы одна VM отображалась в нескольких местах несколькими разными View, причём по-разному. Это нормальная практика.
Комментариев нет:
Отправить комментарий