2012-03-25 33 views
3

当TreeViewItem是像Textbox一样的输入控件时,TreeView的SelectedItemChanged事件和SelectedItem属性不会发生。下面的代码示例通过在TreeView SelectedItemChanged事件中放置断点来说明问题。当选择“字符串标题”时,此断点将触发,但不会显示“文本框标题”。TreeView SelectedItem行为与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

你应该抓住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

+0

恐怕我在简化我的问题。我的TreeView的文本框TreeViewItems实际上是通过MEF从第三方程序集中获得的。长话短说我必须处理TreeView上的事件。但是,您认为我可以/应该在TreeView级别处理冒泡的GotFocus事件吗? – aidesigner 2012-03-25 03:26:23

+0

当然,即使你将GotFocus =“UIElement_OnGotFocus”移动到TreeView,它也能工作。但不要忘记添加这个检查处理程序:item!= null(我已经更新了答案) – asktomsk 2012-03-25 04:11:00

+0

真棒!如果可能的话,我必须结束问题。 1)出于理解的目的,你知道为什么SelectedItemChanged为TreeViewItems内容(比如Label)而不是Textbox自动工作 - 什么是不存在的冒泡事件? 2)在你的链接的GetParentObject方法中,最后的手段是使用VisualTreeHelper。为什么仅使用VisualTreeHelper查找父级是不够的? – aidesigner 2012-03-25 12:43:18