首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在mvvm中绑定鼠标双击命令

如何在mvvm中绑定鼠标双击命令
EN

Stack Overflow用户
提问于 2012-12-25 04:40:58
回答 2查看 38.4K关注 0票数 19

我有listview,当有人双击任何位置时,我想要显示新窗口。但我有mvvm应用程序,我不想在xaml文件后面的代码中有任何函数,像这样:How to bind a Command to double-click on a row in DataGrid和许多其他类似的示例。我希望在viewmodel文件中有方法,并像这样绑定它:

代码语言:javascript
复制
<ListView ... MouseDoubleClick="{Binding myfunction}"> 

谢谢

EN

回答 2

Stack Overflow用户

发布于 2012-12-25 14:18:44

您可以使用Attached Properties绑定任何您想要的事件。

对于MouseDoubleClick

代码语言:javascript
复制
namespace Behavior
{
public class MouseDoubleClick
{
    public static DependencyProperty CommandProperty =
        DependencyProperty.RegisterAttached("Command",
        typeof(ICommand),
        typeof(MouseDoubleClick),
        new UIPropertyMetadata(CommandChanged));

    public static DependencyProperty CommandParameterProperty =
        DependencyProperty.RegisterAttached("CommandParameter",
                                            typeof(object),
                                            typeof(MouseDoubleClick),
                                            new UIPropertyMetadata(null));

    public static void SetCommand(DependencyObject target, ICommand value)
    {
        target.SetValue(CommandProperty, value);
    }

    public static void SetCommandParameter(DependencyObject target, object value)
    {
        target.SetValue(CommandParameterProperty, value);
    }
    public static object GetCommandParameter(DependencyObject target)
    {
        return target.GetValue(CommandParameterProperty);
    }
    private static void CommandChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
    {
        Control control = target as Control;
        if (control != null)
        {
            if ((e.NewValue != null) && (e.OldValue == null))
            {
                control.MouseDoubleClick += OnMouseDoubleClick;
            }
            else if ((e.NewValue == null) && (e.OldValue != null))
            {
                control.MouseDoubleClick -= OnMouseDoubleClick;
            }
        }
    }
    private static void OnMouseDoubleClick(object sender, RoutedEventArgs e)
    {
        Control control = sender as Control;
        ICommand command = (ICommand)control.GetValue(CommandProperty);
        object commandParameter = control.GetValue(CommandParameterProperty);
        command.Execute(commandParameter);
    }
}
}

在Xaml中:

代码语言:javascript
复制
 <ListBox Behavior:MouseDoubleClick.Command="{Binding ....}"
          Behavior:MouseDoubleClick.CommandParameter="{Binding ....}"/>
票数 17
EN

Stack Overflow用户

发布于 2012-12-25 04:56:05

最简单的方法是使用System.Windows.InteractivityMicrosoft.Expression.Interactions (都可以通过Blend SDK免费获得)

因此,首先将以下名称空间添加到视图中

代码语言:javascript
复制
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"

接下来,捕获DoubleClick事件并将其传递给命令:

代码语言:javascript
复制
<ListView ..... >
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseDoubleClick">
            <local:EventToCommand Command="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DataContext.myfunction}" />
         </i:EventTrigger
    </i:Interaction.Triggers>
</ListView>

注意:使用的EventToCommand是从MVVM Light Toolkit下载的,可以从here下载。它所做的是在事件被触发时立即执行命令(myFunction)。

这是基于这样的假设:myFunction命令位于ListView用户的DataContext中。否则,将EventToCommand的绑定修改为命令所在的位置。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14025530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档