Как передать информацию EventArgument из представления для просмотра модели в WPF?

У меня есть элемент управления ListView в моем приложении, который связан с коллекцией CustomObject List < CustomObject >. CustomObject имеет отдельный вид. Этот ListView имеет отдельную модель представления.

Коллекция List _customobject содержится в классе ListView ViewModel.

Мой запрос:

Я хочу вызвать представление, которое показывает свойства пользовательского объекта, когда пользователь дважды щелкает мышью на любой строке ListView. Команда двойного щелчка ListView привязана к команде ListViewDoublClick в модели представления. CustomObject находится в аргументе события команды двойного щелчка по списку. Чтобы добиться этого, я должен передать пользовательский объект (или уникальное свойство id пользовательского объекта, через которое я могу извлечь пользовательский объект из коллекции) в качестве параметра команды.

Пожалуйста, предложите мне решение!!

1 ответ

Решение

Самый простой способ сделать это - добавить обработчик событий двойного щелчка в список. Помните: MVVM не означает отсутствие кода в представлении! Это означает, что представление только обрабатывает проблемы представления. Вы можете привести действительно хороший аргумент, что EventArgs имеют значение только для представления, и если вы хотите передать его в ViewModel, вам следует только передать соответствующую информацию. Если вам нужно что-то вроде извлечения данных из EventArgs для передачи их в ViewModel, это приемлемо и правильно... и лучше, чем передавать EventArgs вниз во ViewModel, IMHO.

(Я уверен, что у меня возникнут некоторые разногласия по этому вопросу, но вопрос взаимодействия с пользовательским интерфейсом является проблемой View, и если альтернативой является написание поведения или использование инфраструктуры для получения одного элемента управления, работающего на одной странице, помните: YAGNI и шаблоны не религия.)

Несколько платформ MVVM позволяют вам сделать это (хотя существует много дискуссий о том, хорошая это идея или нет). В частности, MVVM Light Toolkit добавил это некоторое время назад для поддержки перетаскивания (если я правильно помню сообщение в блоге).

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

Другие вопросы по тегам