具有TextBox子项的TreeView SelectedItem行为

本文关键字:TreeView SelectedItem 行为 TextBox 具有 | 更新日期: 2023-09-27 18:29:05

TreeView的SelectedItemChanged事件和SelectedItem属性在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;
    }

谢谢,

具有TextBox子项的TreeView SelectedItem行为

您应该在TreeView:上捕获GotFocus事件

<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