MVVM和自定义命令?

时间:2015-10-13 16:40:32

标签: c# wpf mvvm command commandbinding

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

所以,为了遵循这个逻辑,我猜我会创建一个名为Classes的文件夹,然后创建一个名为Commands.cs的类文件。

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中引用这个类文件,以便我的用户输入窗口知道命令是什么?

<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>

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

1 个答案:

答案 0 :(得分:2)

Martyn,

让我们说清楚。

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

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

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

Buttons和MenuItems之类的CommandSources绑定到命令:

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

ICommmand包含两种方法:

  1. void执行(...) - 他们做什么
  2. bool CanExecute(...) - 告诉GUI禁用按钮,菜单项,......
  3. 命令位于ViewModel端,因此可以轻松调整视图的数据,如果数据不正确,则禁用该命令。

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

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

    • 您还可以使用InputBindings绑定与命令对应的一些输入手势(键盘或鼠标)

    • 有一些预定义的命令,比如ApplicationCommands(Save,New,...),但你可以定义行为,他们做什么。

    • 这些CommandBindings的有趣之处在于它们从层次结构(Window)的根目录“隧道”到目标,并“冒泡”到根目录。
      跨越层次结构中的每个级别(Grid,Stackpanel,ListBox ...),可以在任何级别处理(和停止)事件

    希望它有所帮助,问候