gpt4 book ai didi

c# - 什么时候调用 CanExecute?

转载 作者:IT王子 更新时间:2023-10-29 04:10:39 27 4
gpt4 key购买 nike

在演示中,我有一个按钮来切换 bool 字段 isAsking。我创建了一个只有在 isAsking==true 时才能执行的命令。

一旦我按下 Toggle 按钮,okButton.IsEnable 立即发生变化,这表明该命令发现了 isAsking 的变化。

我很疑惑为什么命令对象会注意到一个字段的变化。 CanExecute 什么时候被调用?

虽然编写 WPF 应用程序已有一段时间,但我对 WPF 命令还是陌生的。请对这种情况作出解释,如果可能,请指出一些相关的文章或博客(我已经阅读了太多谈论剪切/粘贴命令的文章)。

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="WpfApplication1.MainWindow"
Title="MainWindow" Height="350" Width="525" x:Name="mainWindow" >
<StackPanel>
<Button Name="okButton" Content="Ok" />
<Button Content="Toggle" Click="Button_Click_1"/>
</StackPanel>
</Window>

代码隐藏:

public partial class MainWindow : Window
{
private bool isAsking;

public MainWindow()
{
InitializeComponent();

CommandBinding cb = new CommandBinding();
cb.Command = okCommand;
cb.CanExecute += CanOKExecute;
cb.Executed += cb_Executed;
mainWindow.CommandBindings.Add(cb);
okButton.Command = okCommand;
}

private RoutedCommand okCommand = new RoutedCommand("ok", typeof(MainWindow));


void cb_Executed(object sender, ExecutedRoutedEventArgs e)
{

}

void CanOKExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = isAsking;
}

private void Button_Click_1(object sender, RoutedEventArgs e)
{
isAsking = !isAsking;
}
}

最佳答案

技术上的答案是 CanExecute 将在 CommandManager.RequerySuggested 时被调用。事件被引发。根据文档,这将是...

...when the CommandManager detects conditions that might change the ability of a command to execute.

实际上,这只是意味着您无需担心 CanExecute 何时被调用:WPF 会在它认为合适的时候调用它,根据我的经验,这几乎总是如此满足您的要求。

异常(exception)情况是,如果您有一个后台任务会导致 CanExecute 根据 UI 未触发的内容更改其返回值。在这种情况下,您可能需要手动强制 WPF 运行时重新查询 CanExecute,您可以通过调用 CommandManager.InvalidateRequerySuggested 来执行此操作。

关于c# - 什么时候调用 CanExecute?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14294738/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com