从 View 到 ViewModel 的 WPF 事件绑定?

发布于 2024-12-11 18:17:54 字数 240 浏览 0 评论 0原文

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

我的视图中有一个放置事件,但我想将其替换为由于绑定而导致的 ViewModel。

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

查看代码:

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

What is the best way to bind a WPF event in the View to the ViewModel?

I have a drop event in my View but I want to replace it to the ViewModel due binding.

Found several solutions but none of them did what I expected.

View code:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

一向肩并 2024-12-18 18:17:54

在 MVVM 和 XAML 中处理事件的一种方法是使用 Blend Interactivity 功能。此命名空间包含 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。

One way to handle events in MVVM and XAML is to use the Blend Interactivity features. This namespace contains the InvokeCommandAction and the CallMethodAction classes.

InvokeCommandAction lets you bind any event to a view-model command while CallMethodAction lets you bind any event to a view-model method.

For example if you want to bind the DoubleClick event of a Button to a view-model command you would do like this:

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

And declaring this namespace:

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

All you need to reference it in your projects is to install Expression Blend or the Expression Blend SDK.

聚集的泪 2024-12-18 18:17:54

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

请参阅此,WPF 事件绑定到 ViewModel(对于非命令类) )

Well one way to do is to convert that event into a command and then bind it to presenter command, i.e. by defining event behaviour.

See this, WPF Event Binding to ViewModel (for non-Command classes)

方觉久 2024-12-18 18:17:54
<Button MouseDoubleClick="{eb:EventBinding Command=DoSomethingCommand}">

</Button>

Command

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

{eb:EventBinding Command=CommandName}

CommandParameter

$e (EventAgrs)

$this 或 $this.Property

字符串

https://github.com/JonghoL/EventBindingMarkup

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

</Button>

Command

{eb:EventBinding} (Simple naming pattern to find Command)

{eb:EventBinding Command=CommandName}

CommandParameter

$e (EventAgrs)

$this or $this.Property

string

https://github.com/JonghoL/EventBindingMarkup

风铃鹿 2024-12-18 18:17:54

我从绑定上下文中获取视图模型并从那里激活我的视图模型方法

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

I get the viewmodel from the bindingcontext and activate my viewmodel method from there

    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);
            }
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文