处理WPF中的命令
本文关键字:命令 WPF 处理 | 更新日期: 2023-09-27 18:09:15
我正在尝试处理一个命令。在我的简单应用程序中,我有一个名为txtEditor
的textbox
。在代码中有一个问题,我不知道为什么会发生。
每当我运行以下代码时,它都执行得很好。
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
窗口的构造函数中做什么?
还有什么时候调用的命令会发生这个错误?
这是因为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
。