处理WPF中的命令

本文关键字:命令 WPF 处理 | 更新日期: 2023-09-27 18:09:15

我正在尝试处理一个命令。在我的简单应用程序中,我有一个名为txtEditortextbox。在代码中有一个问题,我不知道为什么会发生。
每当我运行以下代码时,它都执行得很好。

private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
    if (txtEditor != null)
        e.CanExecute = (txtEditor.Text != null) && (txtEditor.SelectionLength > 0);
}

但是对于下面的代码:

private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{    
    e.CanExecute = (txtEditor.Text != null) && (txtEditor.SelectionLength > 0);
}

{"对象引用未设置为对象的实例。"}

已将该命令绑定到Window Collection的CommandBindings
问题是,我不知道这个错误发生的原因,如果txtEditor没有初始化,那么InitializeComponent()方法在WPF窗口的构造函数中做什么?
还有什么时候调用的命令会发生这个错误?

处理WPF中的命令

这是因为CanExecute事件是独立于您的窗口初始化时触发的。触发RequerySuggested事件。这就是为什么不能保证它会在InitializedComponent()被调用后被触发。

您可以通过处理windows的Initialized事件轻松检查此设置:

private void MainWindow_Initialized(object sender, EventArgs e)
{
    System.Diagnostics.Debug.WriteLine("MainWindow initialized");
}
private void CutCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
    System.Diagnostics.Debug.WriteLine("CommandBinding_CanExecute fired");
}
通过这样做,您将注意到CanExecute在您的窗口实际初始化之前被触发,并且在输出窗口中您将看到:
CommandBinding_CanExecute fired
MainWindow initialized
CommandBinding_CanExecute fired
CommandBinding_CanExecute fired

在调用InitializeComponent()之前,txtEditor为空。在这个方法中,所有的UI元素都被初始化:

this.txtEditor = ((System.Windows.Controls.TextBox)(target));

调用后它将不为空,它将是System.Windows.Controls.TextBox

您正在尝试访问指向null的对象。