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 包含两个方法:
- void Execute(...) - 他们做了什么
- bool CanExecute(...) - 告诉 GUI 禁用按钮、菜单项...
命令位于 ViewModel 端,因此它们可以轻松调整视图的数据,如果数据对于要执行的命令不正确,则将被禁用。
您展示的所有内容:CommandBindings,很有趣,但很少使用。
使用 CommandBindings,您可以在 GUI 端附加代码以及所有回调(已执行、PreviewExecutes、CanExecute、PreviewCanExecute)
你也可以用InputBindings
绑定一些命令对应的输入手势(键盘或鼠标)
有一些预定义的命令,例如 ApplicationCommands(Save, New,...) 但由您来定义行为,它们的作用。
这些 CommandBindings 有趣的一面是它们 "tunnel" 从层次结构的根 (Window) 到目标,"bubble" 到根。
跨越层次结构中的每个级别(Grid、Stackpanel、ListBox...),可以在任何级别处理(和停止)事件
希望对您有所帮助,问候
我在这里需要一些答案,因为似乎无法在网上找到很多可以回答我的问题的答案。根据我的理解,在编写 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 包含两个方法:
- void Execute(...) - 他们做了什么
- bool CanExecute(...) - 告诉 GUI 禁用按钮、菜单项...
命令位于 ViewModel 端,因此它们可以轻松调整视图的数据,如果数据对于要执行的命令不正确,则将被禁用。
您展示的所有内容:CommandBindings,很有趣,但很少使用。
使用 CommandBindings,您可以在 GUI 端附加代码以及所有回调(已执行、PreviewExecutes、CanExecute、PreviewCanExecute)
你也可以用InputBindings
绑定一些命令对应的输入手势(键盘或鼠标)
有一些预定义的命令,例如 ApplicationCommands(Save, New,...) 但由您来定义行为,它们的作用。
这些 CommandBindings 有趣的一面是它们 "tunnel" 从层次结构的根 (Window) 到目标,"bubble" 到根。
跨越层次结构中的每个级别(Grid、Stackpanel、ListBox...),可以在任何级别处理(和停止)事件
希望对您有所帮助,问候