Отменить / повторить лучшие практики с помощью MVVM

По сути, я работаю над редактором чертежей, который позволяет вам определять геометрию на основе ключевых точек существующей геометрии. Затем пользователь может добавить некоторую информацию о том, что он только что добавил, такую ​​как имя, ожидаемый размер и т. Д. API, который я использую для этого, - это потрясающий Reversible API, хотя я надеюсь, что вопрос выходит за рамки API, который я использую.

В основном есть пара вопросов, по которым я хочу немного прояснить:

1) Если вы поддерживаете Undo / Redo с приложением, которое поддерживает выбор в режиме Master / Detail, должно ли изменение состояния объекта рисования также вызывать его выбор? Примером является то, что операция отмены изменила имя элемента, и это изменение не будет очевидным, если элемент не был выбран. Считается ли что-то подобное стандартным?

2) При работе с определенными типами инкрементальных изменений (перетаскивание поля или использование числового счетчика) кажется, что это стандартная форма для группы изменений, которые должны быть сгруппированы в одно взаимодействие с пользователем (смахивание мыши или действие по освобождению spinner button), но при работе с MVVM в настоящее время я знаю только то, что свойство изменилось, а не источник изменения. Есть ли стандартный способ распространения этих типов взаимодействий на модель представления без полного разрушения шаблона?


person Mranz    schedule 14.03.2013    source источник


Ответы (1)


В случае сомнений лучший подход - взглянуть на типичное поведение элементов управления ОС и других приложений на платформе, чтобы соответствовать тому, с чем пользователи будут знакомы. В частности, согласованность с наиболее часто используемыми приложениями. Если вы исследуете, как другие приложения подходят к проблеме пользовательского интерфейса, вы часто можете многое узнать, особенно о тонких случаях, которые вы, возможно, не учли в своем собственном дизайне.

1) Обычно при отмене выбираются измененные элементы, как для выделения того, что изменилось, так и для перемещения фокуса ввода пользователя обратно к последнему редактированию, чтобы они могли продолжить. Это особенно хорошо работает для контента, такого как текст, потому что, если вы отмените / вернете что-то, что вы ввели, скорее всего, вы захотите продолжить редактирование в области текста, который вы только что отменили / переделали. Главный выбор, который вы должны сделать с помощью мастера / детали, - выбрать ли только главный объект или выбрать именно ту деталь, которая изменилась.

2) Ваш менеджер отмены может использовать некоторый интеллект, чтобы объединить похожие действия в один шаг отмены. Например, если пользователь вводит несколько символов подряд, он может заметить, что все эти действия похожи, и объединить их в один шаг отмены. То, как это происходит, зависит от того, как вы храните и обрабатываете отмену, но с достойным объектно-ориентированным дизайном это должно быть легко добавить (например, запрашивать сами записи отмены, если они могут быть объединены, чтобы вы могли легко добавлять новые типы отменить запись в будущем). Однако помните, что накопление слишком большого количества изменений на одном этапе может сильно раздражать, поэтому вы можете обнаружить, что более ленивая реализация одного действия = 1 шаг на самом деле обеспечивает лучший UX, чем попытки быть слишком умными. Я бы начал с грубой силы и добавил бы конгломерацию, только если вы обнаружите, что в конечном итоге получаете множество повторяющихся последовательностей отмены (например, 100 движений влево на один пиксель вместо одного прыжка на 100 пикселей)

person Jason Williams    schedule 14.03.2013
comment
Спасибо за понимание. Полагаю, я не совсем уверен, что согласен с вашим ответом на № 2, потому что не уверен, что объект может действительно знать, разрешено ли ему конгломератировать или нет. Лучший способ, которым я мог придумать, это то, что модель пользователя представляет собой отображение 1: 1 между манипуляцией с их стороны и элементом отмены в стеке. Если пользователь щелкает и перетаскивает поле, затем отпускает, а затем снова перетаскивает, можно ожидать, что у него будут две разные операции. Проблема в том, что это плохо согласуется с MVVM, потому что модели представления в идеале не зависят от представления и, следовательно, являются стандартными формами пользовательских манипуляций. - person Mranz; 15.03.2013
comment
Если вы перетащите элемент на 5 пикселей влево, а затем перетащите его на 10 пикселей влево, может ли это быть объединено в одно движение на 15 пикселей? Так что, если вы добавите два шага перемещения подряд, они смогут объединиться - но, конечно, только в том случае, если это имеет смысл в их контексте. Если вы переместите, а затем измените размер, шаги будут несовместимы, поэтому они останутся отличными. - person Jason Williams; 16.03.2013
comment
Проблема в том, что реализация перемещения не соответствует логическому действию перемещения, так что перемещение вправо на 10, отпускание, выбор, перемещение влево на 10, отпускание, в то время как модель пользователя представляет собой 2 различных действия из-за выпуска / выбора, стек отмены повтора будет иметь 2 действия перемещения рядом друг с другом, поэтому наивная реализация попытается объединить их в ход 0. Настоящая проблема заключается в том, что выбор почти никогда не считается отменяемым действием и, следовательно, не создает препятствий. между 2 подобными объектами. MVVM скрывает шаги, потому что обычно это просто привязка позиции - person Mranz; 16.03.2013
comment
На мой взгляд, движение влево и движение вправо не являются эквивалентными действиями, поэтому их не следует объединять. Если движения применяются к разным объектам, их нельзя объединить. Но движение влево и движение влево от одного объекта могут быть объединены. Вот почему вы позволяете действию отмены перемещения определять, можно ли его объединить с предыдущим - объединение должно происходить только в нескольких очень конкретных случаях, которые зависят от точных деталей самих действий. - person Jason Williams; 17.03.2013
comment
Я тестировал его в нескольких распространенных приложениях, таких как word и visio, и вы можете выбрать объект, сойти с ума, проведя по нему пальцем, а затем отменить его выбор. Он записывает начало и конец действия, но не смахивание. Насколько я могу судить, это создает проблему для MVVM, потому что у меня есть что-то, привязанное к характеристике позиции на моей виртуальной машине, и я не могу узнать, каково было взаимодействие с пользователем. Мне нужно провести дальнейшее исследование того, как люди преодолевают это. - person Mranz; 18.03.2013
comment
Я не совсем понимаю, к чему вы клоните. Обычно программы не записывают взаимодействие с пользователем, а только конечный результат. Таким образом, если вы проведете объектом влево и вправо 5 раз во время перетаскивания и опустите его на 10 пикселей влево от начальной точки, программа обычно записывает только окончательный результат, перемещая влево на 10 пикселей. В большинстве случаев нет смысла записывать какие-либо промежуточные движения объекта из-за нерешительности пользователя, только зафиксированный конечный результат. Если вы хотите записать каждое движение, которое вы действительно пытаетесь записать, и воспроизвести движение в реальном времени, не выполняйте отмену / повтор. - person Jason Williams; 19.03.2013
comment
Я полагаю, что я понимаю, что модель представления - это то, что она фиксирует все промежуточные шаги, потому что это представление в реальном времени. Я не знаю никаких парадигм, позволяющих четко информировать модель представления о начале взаимодействия без полного нарушения парадигмы. - person Mranz; 19.03.2013