2016-09-28 3 views
0

Я пытаюсь обрабатывать команду. В моем простом приложении у меня есть textbox с именем txtEditor. В коде есть проблема, что я не знаю, почему это происходит.
Всякий раз, когда я запускаю следующий код, он выполняется хорошо.
Работа с командами в WPF

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

Я получаю эту ошибку:

{"Object reference not set to an instance of an object."}

Я привязан команду к CommandBindings из Window коллекции.
Проблема в том, что я не знаю причину возникновения этой ошибки, если txtEditor не инициализирован, так что делает метод InitializeComponent() в конструкторе окна WPF?
А также Когда команды называются этой ошибкой?

ответ

2

Это происходит потому, что событие CanExecute запускается независимо от вашей инициализации окна при возникновении события CommandManager.RequerySuggested. Поэтому не гарантируется, что он будет запущен после вызова InitializedComponent().

Вы можете легко проверить это с помощью обработки 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 
0

До InitializeComponent() называется txtEditor null. В этом методе все элементы пользовательского интерфейса инициализируется:

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

После вызова не будет аннулирована, то это будет System.Windows.Controls.TextBox. Вы пытаетесь получить доступ к объекту, который ссылается на null.

Смежные вопросы