我在这里需要一些答案,因为似乎无法在网上找到回答我的问题。根据我的理解,在编写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>
我在想这里吗?如果我做错了,有人可以澄清这个或解释如何做我正在尝试的事情吗?
答案 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包含两种方法:
命令位于ViewModel端,因此可以轻松调整视图的数据,如果数据不正确,则禁用该命令。
您展示的所有内容:CommandBindings很有趣,但很少使用。
使用CommandBindings,您可以在GUI端附加所有回调代码(Executed,PreviewExecutes,CanExecute,PreviewCanExecute)
您还可以使用InputBindings绑定与命令对应的一些输入手势(键盘或鼠标)
有一些预定义的命令,比如ApplicationCommands(Save,New,...),但你可以定义行为,他们做什么。
这些CommandBindings的有趣之处在于它们从层次结构(Window)的根目录“隧道”到目标,并“冒泡”到根目录。
跨越层次结构中的每个级别(Grid,Stackpanel,ListBox ...),可以在任何级别处理(和停止)事件
希望它有所帮助,问候