Как привязать команду в WPF к обработчику события двойного щелчка элемента управления?

Мне нужно привязать событие двойного щелчка текстового блока (или, возможно, изображения - в любом случае, это пользовательский элемент управления) к команде в моей ViewModel.

TextBlock.InputBindings, похоже, неправильно привязывается к моим командам, помогите?


person bluebit    schedule 18.08.2009    source источник


Ответы (4)


Попробуйте вложенные команды от Марлона Греча.

person Kent Boogaart    schedule 18.08.2009
comment
У меня уже есть три вспомогательных класса в моем проекте. Я просто хотел бы, чтобы WPF имел полную поддержку всех этих вещей, которые разработчики хотят с ним делать, но я думаю, что это придет со временем, эй. Спасибо, это сработало :) - person bluebit; 18.08.2009
comment
Я согласен с вашим общим мнением - немного расстраивает, что поддержка MVVM больше не встроена в WPF. Большинство опытных разработчиков WPF создали свою собственную небольшую библиотеку вспомогательных материалов. Разрыв в функциональности становится еще больше, если вы работаете с Silverlight! - person Kent Boogaart; 18.08.2009
comment
Не ссылайтесь только на внешний сайт - пожалуйста, включите ответ. Если сайт когда-нибудь исчезнет, ​​это станет бесполезным. - person Anthony Nichols; 03.12.2019

<Button>
<Button.InputBindings>
<MouseBinding Gesture="LeftDoubleClick" Command="YourCommand" />
</Button.InputBindings>
</Button>

http://thejoyofcode.com/Invoking_a_Command_on_a_Double_Click_or_other_Mouse_Gesture.aspx

person Legz    schedule 30.07.2011
comment
+1 Лично я считаю, что этот ответ должен быть помечен как правильный. Он не только самый простой, но его также можно использовать с MVVM путем привязки к ICommand в модели представления: <MouseBinding Gesture="LeftDoubleClick" Command="{Binding YourCommand}" /> - person Sheridan; 15.11.2011
comment
не работает (возможно, только на некоторых объектах), пока вы не сделаете это: telerik.com/community/forums/wpf/gridview/ - person D_Guidi; 06.12.2011
comment
Хорошая альтернатива грязному привязанному поведению :) - person Claudiu Constantin; 13.03.2012
comment
Это просто целая сумка обалденности! Это даже относится к другим элементам управления из коробки. например ‹TextBlock.InputBindings› - person PaulMolloy; 02.10.2012
comment
Однако вы не можете использовать это в стиле. - person user99999991; 15.12.2015
comment
Вау, за 10 лет программирования WPF я всегда решал эту проблему и видел, как это решалось, возвращаясь к событиям нажатия мыши. - person Dabblernl; 03.02.2019

это просто, давайте использовать способ MVVM: я использую здесь MVVM Light, который прост в освоении и силен.

1. поместите следующие строки в объявления xmlns:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"  
xmlns:GalaSoft_MvvmLight_Command="clr-namespace:GalaSoft.MvvmLight.Command;
                                   assembly=GalaSoft.MvvmLight.Extras.WPF4"

2. Определите свой текстовый блок следующим образом:

<textBlock text="Text with event">
   <i:Interaction.Triggers>
      <i:EventTrigger EventName="MouseDoubleClick">
         <GalaSoft_MvvmLight_Command:EventToCommand 
                             Command="{Binding Edit_Command}"/>
      </i:EventTrigger>
   </i:Interaction.Triggers>
</textBlock>

3. Затем напишите свой код команды в своей модели просмотра !!!

ViewModel1.cs

Public RelayCommand Edit_Command
{
   get;
   private set;
}

Public ViewModel1()
{
   Edit_Command=new RelayCommand(()=>execute_me());
}

public void execute_me()
{
   //write your code here
}

Я надеюсь, что это сработает для вас, поскольку я использовал его в приложении Real ERP.

person Adam    schedule 30.11.2011
comment
Немного запутанно с этими «гала-мягкими штучками», но интерактивный подход хорош! - person Simon K.; 09.12.2015

У меня также была аналогичная проблема, когда мне нужно было привязать событие MouseDoubleClick списка к команде в моей ViewModel.

Самое простое решение, которое я придумал, - это поместить фиктивную кнопку с желаемой привязкой команды и вызвать метод Execute команды кнопки в обработчике события MouseDoubleClick.

.xaml

 <Button Visibility="Collapsed" Name="doubleClickButton" Command="{Binding Path=CommandShowCompanyCards}"></Button>
                <ListView  MouseDoubleClick="ListView_MouseDoubleClick" SelectedItem="{Binding Path=SelectedCompany, UpdateSourceTrigger=PropertyChanged}" BorderThickness="0" Margin="0,10,0,0" ItemsSource="{Binding Path=CompanyList, UpdateSourceTrigger=PropertyChanged}" Grid.Row="1" HorizontalContentAlignment="Stretch" >

программный код

     private void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
            {
                doubleClickButton.Command.Execute(null);
            }

Это не просто, но очень просто и работает.

person irem    schedule 15.04.2010