当 TreeViewItem 是一个像 Textbox 这样的输入控件时,不会发生 TreeView 的 SelectedItemChanged 事件和 SelectedItem 属性。下面的示例代码通过在 TreeView SelectedItemChanged 事件中放置一个断点来说明问题。选择“字符串 header ”,而不是“TextBox header ”。
时,此断点将发射。我假设 Textbox 或 RichTextbox(我的真实应用程序)正在消耗一些重要的冒泡事件。如何让 TreeView SelectedItem 对 TextBox 表现得像对 Label 之类的控件一样?
注意:如果我能解决这个问题,我将需要双向绑定(bind)到 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;
}
谢谢,
最佳答案
您应该在 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
关于c# - 带有 TextBox 子项的 TreeView SelectedItem 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9857577/