Поведение TreeView SelectedItem с потомками TextBox - PullRequest
3 голосов
/ 25 марта 2012

Событие SelectedItemChanged и свойство SelectedItem TreeView не происходят, когда TreeViewItem является элементом управления вводом, таким как Textbox.Пример кода ниже иллюстрирует проблему путем размещения точки останова в событии TreeView SelectedItemChanged.Эта точка останова срабатывает при выборе «Заголовок строки», но не «Заголовок текстового поля».

Я предполагаю, что Textbox или RichTextbox (мое реальное приложение) потребляет какое-то жизненно важное всплывающее событие.Как я могу заставить TreeView SelectedItem вести себя для TextBox так же, как для элемента управления, такого как Label?

Примечание. Если я смогу решить эту проблему, мне потребуется выполнить двустороннюю привязку к SelectedItem, так как я использую MVVM иMEF.SelectedItem только для чтения, что является проблемой, которую я планирую решить (http://silverscratch.blogspot.com/2010/11/two-way-binding-on-treeviewselecteditem.html).Я думал, что эта ссылка может помочь кому-то.

XAML:

<TreeView SelectedItemChanged="TreeView_SelectedItemChanged">
    <TreeViewItem>
        <TreeViewItem.Header>
            <TextBox>
                Textbox Header
            </TextBox>
        </TreeViewItem.Header>
    </TreeViewItem>
    <TreeViewItem>
        <TreeViewItem.Header>
            String Header
        </TreeViewItem.Header>
    </TreeViewItem>
</TreeView>

Код сзади:

    private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        // Breakpoint will fire when "String Header" Selected
        // !!! Breakpoint does not fire when Textbox Selected
        var newValue = e.NewValue;
        var oldValue = e.OldValue;
    }

Спасибо,

1 Ответ

1 голос
/ 25 марта 2012

Вы должны поймать GotFocus событие на вашем TreeView:

<TreeView SelectedItemChanged="TreeView_SelectedItemChanged"
          GotFocus="UIElement_OnGotFocus">
   <TreeViewItem>
      <TreeViewItem.Header>
          <TextBox>Textbox Header</TextBox>
       </TreeViewItem.Header>
   </TreeViewItem>
   <TreeViewItem>
        <TreeViewItem.Header>String Header</TreeViewItem.Header>
   </TreeViewItem>
 </TreeView>

private void UIElement_OnGotFocus(object sender, RoutedEventArgs e)
{
    TreeViewItem item = UIHelpers.TryFindParent<TreeViewItem>   
                           ((DependencyObject) e.OriginalSource);
    if (item != null)
          item.IsSelected = true;
}

Реализация TryFindParent вы можете найти здесь:
https://stackoverflow.com/a/4838168/1088908

...