从 View 到 ViewModel 的 WPF 事件绑定?
Posted
技术标签:
【中文标题】从 View 到 ViewModel 的 WPF 事件绑定?【英文标题】:WPF event binding from View to ViewModel? 【发布时间】:2011-12-14 05:17:01 【问题描述】:将视图中的 WPF 事件绑定到 ViewModel 的最佳方法是什么?
我的视图中有一个放置事件,但我想将其替换为视图模型到期绑定。
找到了几个解决方案,但没有一个能达到我的预期。
查看代码:
<TextBox
AllowDrop="True"
PreviewDrop="email_Drop" />
【问题讨论】:
Imo 将事件绑定到视图模型从来都不是一个好主意。当然,这取决于您希望 MVVM 如何为您工作,但我们严格区分事件,即 ui 逻辑和命令,即业务逻辑。只是想添加这个 :) 最后这很大程度上取决于您想要实现的方式和目标。 谢谢,好的评论我会记住这一点。现在我只希望文件后面的代码为空。但从我读过的所有内容来看,你是对的;) @dowhilefor 这本身就是一个答案——而且是一个很好的答案。建议你写点东西。 :) 【参考方案1】:在 MVVM 和 XAML 中处理事件的一种方法是使用混合交互功能。此命名空间包含 InvokeCommandAction 和 CallMethodAction 类。
InvokeCommandAction 允许您将任何事件绑定到视图模型命令,而 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。
【讨论】:
【参考方案2】:一种方法是将该事件转换为命令,然后将其绑定到演示者命令,即通过定义事件行为。
看到这个,WPF Event Binding to ViewModel (for non-Command classes)
【讨论】:
我找到了 EventToCommand 解决方案,但我不是它的超级粉丝,所以想知道是否有更好的方法来解决这个问题,但谢谢 ;) :) 如果适合您,您可以尝试附带的属性解决方案【参考方案3】:<Button MouseDoubleClick="eb:EventBinding Command=DoSomethingCommand">
</Button>
命令
eb:EventBinding(查找命令的简单命名模式)
eb:EventBinding Command=CommandName
命令参数
$e (EventAgrs)
$this 或 $this.Property
字符串
https://github.com/JonghoL/EventBindingMarkup
【讨论】:
【参考方案4】:我从 bindingcontext 中获取 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);
【讨论】:
以上是关于从 View 到 ViewModel 的 WPF 事件绑定?的主要内容,如果未能解决你的问题,请参考以下文章
WPF MVVM 架构 Step By Step(把actions从view model解耦)
WPF MvvmLight RelayCommand 绑定Command 的使用