将View中的WPF事件绑定到ViewModel的最佳方法是什么?
我在View中有一个drop事件,但我想将它替换为ViewModel到期绑定。 找到了几个解决方案,但没有一个能达到我的预期。
查看代码:
<TextBox
AllowDrop="True"
PreviewDrop="email_Drop" />
答案 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
的字符串
答案 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);
}
}