从 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 的使用

WPF:MVVM模式下ViewModel关闭View

WPF View 在关闭时将 ViewModel 属性设置为 null

将事件绑定到 ViewModel

wpf mvvm模式下 在ViewModel关闭view