c# - 带有 TextBox 子项的 TreeView SelectedItem 行为

标签 c# wpf treeview treeviewitem

当 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/

相关文章:

c# - CSCore应用程序音频混音器名称+峰值

c# - 如何获取在 TreeView 控件中选择的所有父节点(直到根节点)?

delphi - 递归遍历 TreeView 中的节点?

c# - Informix 和 .NET 的时间和日期时间格式

wpf - 删除集合元素时出现 {RelativeSource PreviousData} 的问题

c# - 嵌套 View - 如何从 Controller 访问?

wpf - 使用 DataTemplate 时更改内容会更改 DataContext

treeview - Gtk.TreeView 无法添加自定义渲染器,断言 'gtk_cell_area_has_renderer (area, renderer)' 失败

c# - 如何在 Azure Functions 中使用 Http 触发器进行模型绑定(bind)?

c# - 将 ValueTuple 转换为 IEnumerable