处理WPF中的命令

时间:2016-09-28 08:19:46

标签: c# wpf

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

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);
}

我收到此错误:

  

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

我已将命令绑定到CommandBindings收集的Window
问题是我不知道发生此错误的原因,如果txtEditor未初始化,那么方法InitializeComponent()WPF窗口的构造函数中做了什么?
并且命令何时调用此错误?

2 个答案:

答案 0 :(得分:2)

这是因为CanExecute事件在触发CommandManager.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

答案 1 :(得分:0)

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

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

调用后它不会为空,它将是System.Windows.Controls.TextBox。您正在尝试访问引用null的对象。