MVVM 和自定义命令?

MVVM and custom commands?

我在这里需要一些答案,因为似乎无法在网上找到很多可以回答我的问题的答案。根据我的理解,在编写 WPF 应用程序时遵循 MVVM 工作流,数据、逻辑和用户输入需要分开。

所以,按照这个逻辑,我猜我会创建一个名为 Classes 的文件夹,然后创建一个名为 Commands.cs 的 class 文件。

Commands.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Duplicate_Deleter.Classes
{
    class WindowCommands
    {

    }
    class DatabaseCommands
    {

    }
    class OtherCommands
    {

    }
}

然后我必须在我的 XAML 中引用这个 class 文件,以便我的用户输入 window 知道命令是什么?

<Window
xmlns:local="clr-namespace:Classes.Commands">
</Window>

然后我当然会设置命令,以便它知道对每个状态使用哪种方法,例如:

<Window.CommandBindings>
        <CommandBinding Command="WindowCommands.WindowClose" Executed="CloseWindow_Executed" CanExecute="CloseWindow_CanExecute" />
        <CommandBinding Command="WindowMinimize" Executed="CloseWindow_Executed" CanExecute="CloseWindow_CanExecute" />
    </Window.CommandBindings>

我在想这里吗?如果我做错了,有人可以澄清这一点或解释如何做我正在尝试的事情吗?

马丁,

让我们把事情说清楚。

命令是 MVVM 的重要组成部分。

但大多数时候命令(ICommand 的实现者)是 ViewModel 对象的属性。

public class MyViewModel{
   public ICommand SaveCmd { get; set; }
}

按钮和菜单项等命令源绑定到命令:

<Button Command="{Binding SaveCmd}" Content="Save" />

ICommmand 包含两个方法:

  1. void Execute(...) - 他们做了什么
  2. bool CanExecute(...) - 告诉 GUI 禁用按钮、菜单项...

命令位于 ViewModel 端,因此它们可以轻松调整视图的数据,如果数据对于要执行的命令不正确,则将被禁用。

您展示的所有内容:CommandBindings,很有趣,但很少使用。

  • 使用 CommandBindings,您可以在 GUI 端附加代码以及所有回调(已执行、PreviewExecutes、CanExecute、PreviewCanExecute)

  • 你也可以用InputBindings

  • 绑定一些命令对应的输入手势(键盘或鼠标)
  • 有一些预定义的命令,例如 ApplicationCommands(Save, New,...) 但由您来定义行为,它们的作用。

  • 这些 CommandBindings 有趣的一面是它们 "tunnel" 从层次结构的根 (Window) 到目标,"bubble" 到根。
    跨越层次结构中的每个级别(Grid、Stackpanel、ListBox...),可以在任何级别处理(和停止)事件

希望对您有所帮助,问候