Я бы сказал «сделай это проще».
Что действительно важно в MVVM это:
- что не зависит отпредставление должно идти в ViewModel (ваша ViewModel не должна знать о представлении каким-либо образом - не только по ссылке на объект)
- все остальное в представлении и его коде позади .
Да, в своем коде .Нет ничего плохого в написании кода, если это код, связанный с представлением, а не логика.Например, управление перетаскиванием должно быть написано в коде позади.
Чтобы ответить на ваш вопрос, вы ничего не нарушаете в письменной форме:
// in View's Click event handler
ViewModel.AddCommand.Execute(null);
EnsureVisibleSelectedItem();
BeginEdit();
Все, что не связано спредставление находится в ViewModel, все остальное в View / code-behind.Это нормально.
Нет, если я посмотрю на ваш второй пример:
// in ViewModel's AddCommand
AddNewItem();
SetCurrentItem();
SendMessageToEnsureVisibleSelectedItem();
SendMessageToBeginEditSelectedItem();
AddNewItem
в порядке (не относится к представлению), SetCurrentItem
в порядке (не связано свид), а как насчет SendMessageToEnsureVisibleSelectedItem
и SendMessageToBeginEditSelectedItem
?EnsureVisible
обычно полезен для древовидной структуры, но что если ваш вид не был построен с древовидной структурой?Что если элемент управления автоматически сделает видимым новый выбранный элемент?Конечно, вы можете проигнорировать это сообщение, но вы бы написали какой-то бесполезный код во ViewModel, потому что вы думали, что вашему представлению он понадобится для отображения пользовательского интерфейса.
Обычно вы пишете здесь некоторый код в ViewModel, который знает окак должно работать представление. Да, вы сократили количество строк в коде, но вы определенно нарушили шаблон .
Ваш "старый способ" на самом деле является хорошим способом для ваших нужд.Ваша ViewModel не знает о представлении, вот что важно.