当TreeViewItem是像Textbox这样的输入控件时,不会发生TreeView的SelectedItemChanged事件和SelectedItem属性。下面的示例代码通过在TreeView SelectedItemChanged事件中放置断点来说明问题。选择“字符串标题”时将触发此断点,但不会触发“文本框标题”。
我认为Textbox或RichTextbox(我的真实应用程序)正在吃一些重要的冒泡事件。如何让TreeView SelectedItem像Text一样对TextBox进行操作?
注意:如果我可以解决这个问题,我将需要双向绑定到SelectedItem,因为我正在使用MVVM和MEF。 SelectedItem是readonly,这是问题,我计划用(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;
}
谢谢,
答案 0 :(得分: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