TreeView SelectedItem behavior with TextBox children

The SelectedItemChanged event selected and the SelectedItem property of the TreeView do not fire when the TreeViewItem is an input control such as a Textbox. The sample code below illustrates the problem by setting a breakpoint in the TreeView SelectedItemChanged event. This breakpoint will be triggered if "String Header" is selected but not "Header Textbox".

I am assuming that the textbox or RichTextbox (my real application) is some sort of vital event for the bubbles. How can I get the TreeView SelectedItem to behave for the TextBox in the same way as for a control like Label?

Note. If I can solve this problem I will need a two way binding to the SelectedItem since I am using MVVM and MEF. SelectedItem is readonly - the problem I'm planning to solve ( http://silverscratch.blogspot.com/2010/11/two-way-binding-on-treeviewselecteditem.html ). I thought this linked link might help someone.

XAML:

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

      

Code for:

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

      

Thank,

+3


source to share


1 answer


You have to catch the event GotFocus

on 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

You can find the implementation here:
fooobar.com/questions/1788159 / ...

+1


source







All Articles