#c_sharp #wpf #mvvm #логика
Всем привет! Возможно вопрос типичный. Но не дает мне покоя. Если с моделями, вроде таблиц, вопросов не возникает, то в данном случае не смог найти ответа. Суть: дорабатываю свою программу (WPF) вышивки крестиком, возникла потребность рисования с различными его аспектами (типы, выделение и тп). Есть примерно такой код (идею подсмотрел в FastGrid): enum CellBlockType { CrossStitch, HalfStitch, //... } interface ISchemeCellBlock { CellBlockType BlockType { get; } //... } interface ISchemeCell { int BlockCount { get; } ISchemeCellBlock GetBlock(int index); } interface ISchemeModel { int RowCount { get; } int ColumnCount { get; } ISchemeCell GetCell(ISchemeView view, int row, int column); void HandleCommand(ISchemeView view, CellAddress address, object commandParameter, ref bool handled); } interface ISchemeView { void InvalidateCell(int row, int column); void InvalidateAll(); bool ShowGuideline { get; set; } //... } struct CellAddress { } В данный момент все действия мыши обрабатываются в HandleCommand, а в качестве commandParameter передаются MouseEvenArgs, чтобы понимать когда рисовать/не рисовать, перемещать/вставлять и тп. Таким образом, ISchemeView изменяет данные модели минуя ViewModel, но и не в коде самого представления. В самой же ViewModel предполагается выбор "кистей рисования", масштабирование, команды ввода/вывода и все косвенные изменения модели. Имеет ли право на жизнь такой код в рамках MVVM? Или же надо "отправлять" действия мыши из ISchemeView во ViewModel, а уже через нее воздействовать на саму модель? UPD: Итак, сделал как предложил RusArt: переместил редактирование в codebehind контрола. Что имею теперь: Model - набор классов, реализующих вышеописанные интерфейсы. View содержит сам контрол и кнопки для выполнения команд. ViewModel отдает класс, реализующий ISchemeModel, в контрол через свойство, команды во View для управления ISchemeModel (сохранение, ведение истории изменений и т.п.), а также "отдает" во View коллекцию элементов (палитру) из ISchemeModel. Такой подход будет правильный? И можно ли назвать мои типы данных моделью или что ею считать? Хотелось бы до конца разобраться.
Ответы
Ответ 1
Если вы хотите следовать паттерну MVVM, то у вас пока не получается. Model ничего не должна знать про View, а у вас знает (вы передаете ISchemeView и MouseEvenArgs) Познакомьтесь с командами (интерфейс ICommand). Часто используются сторонние реализации типа DelegateCommand: public class DelegateCommand : ICommand { private readonly Predicate
Комментариев нет:
Отправить комментарий