В приложении WPF с использованием MVVM у меня есть пользовательский элемент управления с элементом списка. Во время выполнения он будет использовать привязку данных для заполнения списка объектов коллекцией объектов.
Как правильно прикрепить событие двойного щелчка к элементам в представлении списка, чтобы при двойном щелчке по элементу в представлении списка запускалось соответствующее событие в модели представления и содержало ссылку на выбранный элемент?
Как это можно сделать с помощью чистого MVVM, т.е. без кода в представлении?
Я могу заставить это работать с .NET 4.5. Кажется прямолинейным, и никакой третьей стороны или кода не требуется.
источник
InputBindings
доступны с .NET 3.0 и не доступны в Silverlight.Мне нравится использовать присоединенные командные поведения и команды. У Марлона Греча очень хорошая реализация прикрепленного командного поведения. Используя их, мы могли бы затем назначить стиль свойству ListView ItemContainerStyle, которое будет устанавливать команду для каждого ListViewItem.
Здесь мы устанавливаем команду, которая будет запускаться при событии MouseDoubleClick, а CommandParameter будет объектом данных, на который мы нажимаем. Здесь я поднимаюсь вверх по визуальному дереву, чтобы получить команду, которую использую, но вы можете так же легко создавать команды для всего приложения.
Для команд вы можете либо реализовать ICommand напрямую, либо использовать некоторые вспомогательные средства , подобные тем, которые входят в набор инструментов MVVM .
источник
acb:
= AttachedCommandBehavior. Код можно найти в первой ссылке в ответеЯ нашел очень простой и понятный способ сделать это с помощью триггеров событий Blend SDK. Чистый MVVM, многоразовый и без кода программной части.
У вас наверняка уже есть что-то вроде этого:
Теперь включите ControlTemplate для ListViewItem, как это, если вы его еще не используете:
GridViewRowPresenter будет визуальным корнем всех элементов «внутри», составляющих элемент строки списка. Теперь мы могли бы вставить туда триггер для поиска перенаправленных событий MouseDoubleClick и вызвать команду через InvokeCommandAction следующим образом:
Если у вас есть визуальные элементы «над» GridRowPresenter (возможно, начиная с сетки), вы также можете поместить туда триггер.
К сожалению, события MouseDoubleClick не генерируются для каждого визуального элемента (например, они происходят из Controls, но не из FrameworkElements). Обходной путь - создать класс из EventTrigger и искать MouseButtonEventArgs с ClickCount, равным 2. Это эффективно отфильтровывает все события, отличные от MouseButtonEvents, и все MoseButtonEvents с ClickCount! = 2.
Теперь мы можем написать это ('h' - это пространство имен вспомогательного класса выше):
источник
Я понимаю, что этому обсуждению год, но есть ли какие-нибудь мысли по поводу этого решения с .NET 4? Я абсолютно согласен с тем, что цель MVVM НЕ в том, чтобы устранить код за файлом. Я также очень твердо уверен, что то, что что-то сложно, не означает, что это лучше. Вот что я вставил в код:
источник
Вы можете использовать функцию Action Caliburn для сопоставления событий с методами вашей ViewModel. Предполагая, что у вас есть
ItemActivated
методViewModel
, соответствующий XAML будет выглядеть так:Для получения дополнительной информации вы можете изучить документацию и образцы Caliburn.
источник
Я считаю, что проще связать команду при создании представления:
В моем случае это
BindAndShow
выглядит так (updatecontrols + avalondock):Хотя этот подход должен работать с любым методом открытия новых представлений.
источник
Видел решение от рушуи с InuptBindings, но я все еще не мог попасть в область ListViewItem, где не было текста - даже после установки прозрачного фона, поэтому я решил это, используя разные шаблоны.
Этот шаблон предназначен для случаев, когда ListViewItem выбран и активен:
Этот шаблон предназначен для случаев, когда ListViewItem выбран и неактивен:
Это стиль по умолчанию, используемый для ListViewItem:
Что мне не нравится, так это повторение TextBlock и его привязки к тексту, я не знаю, я могу обойтись без объявления этого только в одном месте.
Я надеюсь, что это поможет кому-то!
источник
listviewitem
, вероятно, не волнует, выбран он уже или нет. Также важно отметить, что эффект выделения может также нуждаться в корректировке, чтобы соответствоватьlistview
стилю. Проголосовали "за".Мне удалось реализовать эту функциональность с помощью .Net 4.7 framework с помощью библиотеки интерактивности, прежде всего убедитесь, что объявили пространство имен в файле XAML
Затем установите Event Trigger с его соответствующим InvokeCommandAction внутри ListView, как показано ниже.
Посмотреть:
Адаптации приведенного выше кода должно быть достаточно, чтобы событие двойного щелчка работало на вашей ViewModel, однако я добавил вам класс Model и View Model из моего примера, чтобы вы могли иметь полное представление.
Модель:
Просмотреть модель:
Если вам нужна реализация класса DelegateCommand .
источник
Вот поведение, которое выполняется на обоих
ListBox
иListView
.Вот класс расширения, используемый для поиска родителя.
Использование:
источник