如何在WPF中将命令绑定到控件的双击事件处理程序?

72

我需要将文本块(或者可能是图像 - 总之,都是用户控件)的双击事件绑定到 ViewModel 中的一个命令上。

TextBlock.InputBindings 似乎无法正确地绑定到我的命令,请帮忙解决一下?

4个回答

299

49
+1 就我个人而言,我认为这个答案应该被标记为正确答案。不仅它非常简单,而且还可以与MVVM一起使用,通过将其绑定到视图模型中的 ICommand 来实现: <MouseBinding Gesture="LeftDoubleClick" Command="{Binding YourCommand}" /> - Sheridan
4
不错的选择,比混乱的附加行为更方便 :) - Claudiu Constantin
8
太棒了!这甚至适用于其他控件的默认设置。例如:<TextBlock.InputBindings> - PaulMolloy
2
然而,似乎您无法在样式中使用这个。 - user99999991
你可以在样式中使用它,但必须使用RelativeSource并查找实际的DataContext。样式没有DataContext。 - Alexandru Dicu
显示剩余2条评论

9

很简单,我们可以使用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. 然后在您的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
这些“gala-soft-stuff”有点凌乱,但交互方式不错! - Simon K.

8

4
我已经在项目中有三个辅助类。我希望WPF可以完全支持开发人员想要做的所有这些事情,但我猜这需要时间来实现。谢谢,那个起作用了 :) - bluebit
2
我同意你的一般观点 - MVVM 的支持没有更多地融入到 WPF 中,这有点令人沮丧。大多数经验丰富的 WPF 开发人员已经建立了自己的辅助帮助库。如果你正在做 Silverlight,功能上的差距甚至更大! - Kent Boogaart
4
请不要仅提供外部链接 - 请包括答案。如果该网站消失,这将变得无用。 - Anthony Nichols

2

我曾经也遇到过类似的问题,需要将listview的MouseDoubleClick事件绑定到ViewModel中的一个命令。

我想到的最简单的解决方法是在其中放置一个虚拟按钮,该按钮具有所需的命令绑定,并在MouseDoubleClick事件的事件处理程序中调用按钮命令的Execute方法。

.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" >

codebehind

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

虽然不是很直观,但实际上很简单且有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接