2012-03-25 28 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