从视图绑定到视图模型的WPF事件绑定?

33

如何将WPF视图中的事件绑定到ViewModel?

我在我的View中有一个拖放事件,但由于要绑定,我想将它迁移到ViewModel中。

找到了几个解决方案,但都没有达到我预期的效果。

View代码:

    <TextBox 
    AllowDrop="True" 
    PreviewDrop="email_Drop" />

8
将事件绑定到视图模型通常不是一个好主意,当然这取决于你想如何让MVVM为你工作,但我们严格区分UI逻辑的事件和业务逻辑的命令。只是想在最后补充一下:这要大大取决于你想要实现什么以及怎样实现。 - dowhilefor
谢谢,好评,我会记住的。现在我只想让文件背后的代码为空。但是从我所读的所有内容来看,你是正确的 ;) - jefsmi
@dowhilefor 这已经是一个很好的答案了。我建议你写点东西出来。 :) - ANeves
4个回答

70

MVVM和XAML处理事件的一种方法是使用Blend交互功能。该命名空间包含InvokeCommandAction和CallMethodAction类。

InvokeCommandAction可将任何事件绑定到视图模型命令,而CallMethodAction可将任何事件绑定到视图模型方法。

例如,如果您想将按钮的DoubleClick事件绑定到视图模型命令,可以这样做:

<Button>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseDoubleClick">
            <i:InvokeCommandAction Command="{Binding Path=DoSomethingCommand}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Button>

并声明这个命名空间:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

您只需要安装Expression Blend或Expression Blend SDK,即可在项目中引用它。


在使用dotnet 6时,我不得不添加一个不同的命名空间:xmlns:i="http://schemas.microsoft.com/xaml/behaviors"。 - Dbloom

6

我找到了EventToCommand解决方案,但我不是它的铁粉,所以想知道是否有更好的方法来解决这个问题,谢谢 ;) - jefsmi
1
如果适合您,您可以尝试使用附加属性解决方案。 - Bhupendra

2
<Button MouseDoubleClick="{eb:EventBinding Command=DoSomethingCommand}">

</Button>

命令

{eb:EventBinding}(简单的命名模式,用于查找命令)

{eb:EventBinding Command = CommandName}

CommandParameter (命令参数)

$e(EventAgrs)

$this或$this.Property

字符串

https://github.com/JonghoL/EventBindingMarkup


1
我从绑定上下文中获取视图模型,并从那里激活我的视图模型方法。
    public partial class ParentView : ContentPage
    {
            public ParentView()
            {            
                InitializeComponent();
            }

            private void LanguagePicker_SelectedIndexChanged(object sender, System.EventArgs e)
            {
                var parentViewModel = (ParentViewModel)this.BindingContext;
                parentViewModel.SelectedLanguageChanged(sender,e);
            }
    }

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