我正在尝试了解如何使用命令。我读了很多关于命令的文章,而且我知道,大多数时候命令都是在 MVVM 模式中使用的。我也知道,有一个 RoutedCommand 类 - 它通常用于在开发时节省时间。
但是 - 我想了解基础知识 - 这正是问题所在。开始了:
在我的应用程序中,我定义了一个类 'MyCommand' :
public class MyCommand :ICommand
{
public void Execute(object parameter)
{
Console.WriteLine("Execute called!");
CanExecuteChanged(null, null);
}
public bool CanExecute(object parameter)
{
Console.WriteLine("CanExecute called!");
return true;
}
public event EventHandler CanExecuteChanged;
}
好吧 - 为了获得静态访问,我决定为所有应用程序命令创建一个类:
public static class AppCommands
{
private static ICommand anyCommand = new MyCommand();
public static ICommand AnyCommand
{
get { return anyCommand; }
}
}
就快到了。现在我在我的主窗口中放了两个按钮。其中之一是“绑定”到命令:
<StackPanel>
<Button Content="Button" Height="23" Name="button1" Width="75" Click="button1_Click" />
<Button Content="Button" Height="23" Name="button2" Width="75" Command="{x:Static local:AppCommands.AnyCommand}" CommandParameter="Hello"/>
</StackPanel>
这是 MainWindow.cs :
public MainWindow()
{
InitializeComponent();
AppCommands.AnyCommand.CanExecuteChanged += MyEventHandler;
}
private void button1_Click(object sender, RoutedEventArgs e)
{
// Nothing for the moment
}
private void MyEventHandler(object sender, EventArgs e)
{
Console.WriteLine("MyEventHandler called");
}
所以 - 让我们运行我的项目。如您所见,我做了一些控制台输出。如果我点击button2,输出是:
CanExecute 调用!执行调用!CanExecute 调用!MyEventHandler 调用
所以,在我看来,这就是发生的事情:1.)按钮上的命令被“激活”。要检查是否应调用执行方法,请调用 CanExecute 方法。2.) 如果 CanExecute 方法返回 true,则调用 Execute 方法。3.) 在执行方法中,我定义应该引发事件“CanExecuteChanged”。调用它将首先检查“CanExecute”,然后调用事件处理程序。
这对我来说不是很清楚。调用事件的唯一方法是在 Execute 方法中。但是在检查 CanExecute 之后通过命令逻辑调用 Execute 方法。调用事件也会检查 CanExecute,但为什么呢?我很困惑。
当我尝试禁用该按钮时,事情变得更加混乱。可以说,有一个“CommandParameter” - 现在“CanExecute”可以使用它。因此,该方法可能返回 false。在这种情况下,按钮被禁用 - 好的。
但是:我如何重新激活它?正如我们已经知道的:我只能在我的命令类中引发 CanExecuteChange 事件。所以 - 由于我们无法单击禁用按钮 - 该命令不会调用 CanExecute(甚至是 Execute)方法。
在我看来,有些重要的东西我看不到——但我真的找不到。
请你帮助我好吗?