首页 > 解决方案 > 有什么方法更容易绑定到视图模型中的点击事件?

问题描述

我即将将点击事件绑定到 .Net 5 中的视图模型。

有很多关于这个的教程。通过使用第三方 MVVM Light 工具包,或者通过添加一个继承的类ICommand(就像这个按钮点击在 WPF MVVM 中是如何工作的?)。最后,最麻烦的方法是原始微软教程(命令概述)。

所有这些都很麻烦,而且教程是很久以前的事了。

更重要的是,.Net 5 中似乎不再存在最初的 Microsoft 方式( Commanding Overview )。

我想知道是否有一种简单的方法可以实现这一目标?

标签: c#wpfmvvmdata-binding

解决方案


您来源的所有方法都是适用于不同场景的有效方法。

  • 使用ICommandlike RelayCommandor的派生词DelegateCommand(大多数 MVVM 框架提供自己的实现,在某些方面有所不同,但它们使用相同的概念)
  • CommandBindings 用于路由命令,例如ApplicationCommands
  • InputBindingKeyBindings 用于对按键手势 ( ) 或鼠标手势 ( MouseBinding)做出反应
  • EventTrigger触发特定事件时使用调用命令 ( EventToCommand)

MSDN 上也有一篇文章解释了RelayCommandEventToCommand机制。

.所有这些方法在 .NET 5 中仍然存在。但是,如果你想使用行为或触发器(如上面提到的EventToCommand,你应该使用新的Microsoft.Xaml.Behaviors.Wpf NuGet 包而不是Blend 附带的旧交互程序集.

我不会假设有“原始的 Microsoft 方式”,这取决于您的要求。为了将按钮单击绑定到视图模型上的操作,您通常会使用该RelayCommand方法。在您链接的帖子MSDN 上的链接中,您都可以找到RelayCommand. 如果您决定使用任何 MVVM 框架,例如 Caliburn.Micro、Prism 或 MVVM Light,那么已经有一个内置的实现。

您将ICommand在视图模型中公开一个属性并在构造函数中对其进行初始化。

public class MyViewModel : INotifyPropertyChanged
{
   public MyViewModel()
   {
      MyCommand = new RelayCommand(ExecuteMyCommand, CanExecuteMyCommand);
   }

   public ICommand MyCommand { get; }

   private bool CanExecuteMyCommand(object obj)
   {
      // ...obj is the optional command parameter.
      // ...return whether your command can execute.
   }

   private void ExecuteMyCommand(object obj)
   {
      // ...obj is the optional command parameter.
      // ...do something.
   }

   // ...other code.
}

然后你可以在你的视图中绑定命令。确保DataContext您的视图已设置或绑定到您的视图模型的实例,否则绑定将不起作用。

<Button Content="My Button" Command="{Binding MyCommand}" CommandParameter="{Binding Content, RelativeSource={RelativeSource Self}}"/>

命令参数是可选的,我将它绑定到按钮的内容以进行演示。


推荐阅读