2009-08-18 6 views
55

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

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

ответ

9

Попробуйте использовать Marlon Grech's attached command behaviors.

+3

У меня уже есть три вспомогательных классов в моем проекте. Я просто хочу, чтобы WPF полностью поддерживал все эти вещи, которые разработчики хотят с этим поделать, но я думаю, что это придет вовремя. Спасибо, что сработало :) – bluebit

+2

Я согласен с вашим общим настроением - немного разочаровывает, что поддержка MVVM больше не запекается в WPF. Большинство опытных разработчиков WPF создали свою собственную небольшую библиотеку вспомогательных вспомогательных материалов. Разрыв в функциональности еще больше, если вы делаете Silverlight! –

1

У меня также была аналогичная проблема, когда мне нужно было связать событие 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); 
      } 

Это не просто, но это действительно просто, и это работает.

208
<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

+29

+1 Лично я считаю, что этот ответ должен быть отмечен как правильный. Он не только является самым простым, но и может использоваться с MVVM путем привязки к «ICommand» в модели представления: '' – Sheridan

+0

нет (возможно, только на некоторых объектах), пока вы не сделаете это: http://www.telerik.com/community/forums/wpf/gridview/bind-double-click-to-a-viewmodel-command.aspx –

+3

Хорошая альтернатива грязное приложенное поведение :) –

6

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

1.Put следующие строки декларации 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.define ваш TextBlock так же, как это:

<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.Then написать свой командный код в ViewModel !!!

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 
} 

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

+1

Немного грязно с этими «гала-мягкими вещами», но подход «Взаимодействие» хорош! –