我正在尝试处理命令。在我的简单应用程序中,我有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
窗口的构造函数中做了什么?
并且命令何时调用此错误?
答案 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的对象。