从View到ViewModel的WPF事件绑定?

时间:2011-10-24 14:51:53

标签: c# wpf binding

将View中的WPF事件绑定到ViewModel的最佳方法是什么?

我在View中有一个drop事件,但我想将它替换为ViewModel到期绑定。 找到了几个解决方案,但没有一个能达到我的预期。

查看代码:

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

4 个答案:

答案 0 :(得分:46)

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

InvokeCommandAction允许您将任何事件绑定到view-model命令,而CallMethodAction允许您将任何事件绑定到视图模型方法。

例如,如果您想将Button的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。

答案 1 :(得分:4)

一种方法是将该事件转换为命令,然后将其绑定到presenter命令,即通过定义事件行为。

请参阅此WPF Event Binding to ViewModel (for non-Command classes)

答案 2 :(得分:1)

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

</Button>

<强>命令

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

{eb:EventBinding Command = CommandName}

<强> CommandParameter

$ e(EventAgrs)

$ this或$ this.Property

的字符串

https://github.com/JonghoL/EventBindingMarkup

答案 3 :(得分:0)

我从绑定上下文中获取viewmodel并从那里激活我的viewmodel方法

    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);
            }
    }