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

问题描述 投票:0回答:4

我需要将文本块(或者也可能是图像 - 无论哪种方式,它都是用户控件)的双击事件绑定到我的 ViewModel 中的命令。

TextBlock.InputBindings 似乎没有正确绑定到我的命令,有帮助吗?

wpf data-binding mvvm command double-click
4个回答
301
投票
<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


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.然后在你的视图模型中写入你的命令代码!!!

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 应用程序中使用过它


2
投票

我也遇到了类似的问题,我需要将列表视图的 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" >

隐藏代码

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

这并不简单,但非常简单并且有效。


0
投票

我在创建列表视图时遇到了这个问题,所以我想发布我的解决方案,该解决方案源自其中的几个,但不需要编写任何虚拟按钮或附加属性:

文本块不允许设置输入绑定,因此我只是将其包装在网格中并像这样设置鼠标绑定。该命令位于父级的数据上下文中,因此我使用 FindAncestor 获取该命令,并使用 commandParameter 将 ListViewItem 的数据上下文传递给该命令

<ListView.ItemTemplate>
    <DataTemplate>
        <Grid>
            <TextBlock Text="{Binding DisplayName}" />
            <Grid.InputBindings>
                <MouseBinding Gesture="LeftDoubleClick" Command="{Binding Path=DataContext.AddSlotToViewCommand, RelativeSource={RelativeSource AncestorType=ListView, Mode=FindAncestor}}" CommandParameter="{Binding }"/>
            </Grid.InputBindings>
        </Grid>
    </DataTemplate>
</ListView.ItemTemplate>
© www.soinside.com 2019 - 2024. All rights reserved.