MVVM Light:在 XAML 中添加 EventToCommand 而不使用 Blend、更简单的方法或片段?

Posted

技术标签:

【中文标题】MVVM Light:在 XAML 中添加 EventToCommand 而不使用 Blend、更简单的方法或片段?【英文标题】:MVVM Light: Adding EventToCommand in XAML without Blend, easier way or snippet? 【发布时间】:2011-08-17 15:16:52 【问题描述】:

谁能告诉我EventToCommand 类的实际语法是什么。我认为EventToCommand 类适用于 Silverlight / WPF 和 WP7,因此我认为它是一个更好的选择。

据我所知,我可以添加任何点击事件并将其强制添加到我的 ViewModel 中,但我在寻找最佳方法时遇到了问题。

我知道你可以在没有 Blend 的情况下添加它,但是有可用的 sn-ps 吗?

或者有没有更简单的方法可以通过 VS 2010 添加它?任何帮助或如果有人知道这方面的好教程会很棒。

【问题讨论】:

这是一篇来自 MVVMLight 的创建者的关于 all you need to know about EventToCommand 的帖子 ;) 我创建了不需要 MVVMLight 的 a behavior。它确实需要 System.Windows.Interactivity,但接受的答案也是如此。 【参考方案1】:

假设你使用.NetFramework4:

先添加namespace:

xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Platform"

Loaded 事件的语法。

<i:Interaction.Triggers>
    <i:EventTrigger EventName="Loaded">
        <cmd:EventToCommand Command="Binding Mode=OneWay, Path=LoadedCommand"
                            PassEventArgsToCommand="True" />
    </i:EventTrigger>
</i:Interaction.Triggers>

【讨论】:

那么视图模型如何使用这个事件呢? 它将事件转换为命令,在示例中,视图模型上的命令调用,LoadedCommand 将被调用。 完美,谢谢。我将命令名称与我的视图模型中的命令名称匹配,它按预期工作。 Mode=OneWay 位是否必要?没有它似乎也能正常工作。 @Dai OneWay 会在源发生变化时更新目标,TwoWay 在源发生变化时会更新目标,如果目标发生变化也会更新源。【参考方案2】:

我更新了我的项目,看起来他们将命令移至:

xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Platform"

【讨论】:

这与***.com/a/5869889/11635 有何不同 - 啊,我明白了,这是一个后期编辑。这确实应该是对该实例中其他答案的评论【参考方案3】:

0) 如果您不了解 WPF 和 MVVM,请阅读 Josh Smith 关于 WPF 和 MVVM 模式的文章https://msdn.microsoft.com/en-us/magazine/dd419663.aspx

1) 在你的项目中添加包(通过 NuGet)MvvmLightLibs

2) 添加对 System.Windows.Interactivity 的引用

3) 在“查看”XAML 中添加:

一)

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:command="http://www.galasoft.ch/mvvmlight"

b)

<i:Interaction.Triggers>
    <i:EventTrigger EventName="Closing">
      <command:EventToCommand Command="Binding OnClosingCommand"/>
    </i:EventTrigger>
  </i:Interaction.Triggers>
</Window>

4) 在 ViewModel 中添加必要的属性

public ICommand OnClosingCommand

  get
  
    return new RelayCommand(() => SomeMethod());
  

附:在您的视图中应指定 DataContext (XAML)

  <Window.DataContext>
    <vm:MainWindowViewModel/>
  </Window.DataContext>

这是工作。我自己也刚学会。

【讨论】:

我正在准备在列表视图中实现 ItemTapped……但我不知道你的代码应该放在哪里,你能帮我吗?

以上是关于MVVM Light:在 XAML 中添加 EventToCommand 而不使用 Blend、更简单的方法或片段?的主要内容,如果未能解决你的问题,请参考以下文章

MVVM-light已经有一个为INavigationService注册的工厂

MVVM Light,TreeView ItemSsource不更新

MVVM Light须要注意的10个问题

MVVM Light须要注意的10个问题

如何滚动到添加到 MVVM Light 列表视图中的新项目

在 WPF MVVM Light 中多次绑定到 RelayCommand