当前位置: 首页 > 知识库问答 >
问题:

WPF如何在selecteditemchanged事件上获取选定的TreeView项目?

郑安晏
2023-03-14

事件的发送者是树的内部对象。然而,它不是一个依赖对象,所以我不认为我可以使用ItemFromContainer来获取实际的TreeViewItem。我应该怎么做才能得到被选中的实际树状物?

我看到每个人都被我的问题弄糊涂了,就像我被我的问题弄糊涂了一样。

根据链接的站点,我可以从selecteditem属性获取我的treeviewitem。但是,当我尝试执行此操作时,会得到null,因为发送方是SignalViewModel对象,而不是TreeViewItem。

TreeViewItem treeViewItem = this.AvailableSignalsTreeView.SelectedItem as TreeViewItem;

这对我来说返回null,但是调试器显示所选项目的类型是SignalViewModel。

我所要做的就是为树视图获得多选择功能,我将使用我看到的一个例子来实现,这个例子只是切换树视图。

 <TreeView
        Grid.Row="0"
        Background="Blue"
        Foreground="Orange"
        x:Name="AvailableSignalsTreeView"
        SelectedItemChanged="AvailableSignalsTreeView_SelectedItemChanged"
        ItemsSource="{Binding Source={StaticResource available_signals_source}}"
        >

        <TreeView.CommandBindings>
          <CommandBinding Command="ApplicationCommands.SelectAll"
                          Executed="AvailableSignalsTreeView_SelectAll"
                          CanExecute="AvailableSignalsTreeView_SelectAllCanExecute"/>
        </TreeView.CommandBindings>
        <TreeView.InputBindings>
          <KeyBinding
            Command="ApplicationCommands.SelectAll"
            Modifiers="Ctrl"
            Key="A"
            />
        </TreeView.InputBindings>
        <TreeView.ItemTemplate>
          <HierarchicalDataTemplate ItemsSource ="{Binding Path = bits}" >
            <TextBlock
                Text="{Binding Path = SignalName}" 
                />
            <HierarchicalDataTemplate.ItemTemplate>
                      <DataTemplate>
                        <TextBlock
                          Text="{Binding Path = BitNumber}" 
                          />
                      </DataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
          </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
        <TreeView.ContextMenu>
          <ContextMenu>
            <MenuItem Header="Add Bits to Signal" Click="AddBitToSignal" />
          </ContextMenu>
        </TreeView.ContextMenu>
      </TreeView>

共有2个答案

范翰飞
2023-03-14

我想我想的是这个。基本上,所选项不是依赖项对象,因此我无法使用它们遍历树,而必须使用itemcontainer生成器获取容器。

我想我昨天试过了,不知道为什么不起作用。

TreeViewItem tvi = tv.ItemContainerGenerator.ContainerFromItem(tv.SelectedItem) as TreeViewItem;  
苏选
2023-03-14

试试这个:

// Helper to search up the VisualTree
private static T FindAnchestor<T>(DependencyObject current)
    where T : DependencyObject
{
   do
   {
      if (current is T)
      {
         return (T)current;
      }
      current = VisualTreeHelper.GetParent(current);
   }
   while (current != null);
   return null;
}

private void AvailableSignalsTreeView_SelectedItemChanged(
    object sender,
    RoutedPropertyChangedEventArgs<Object> e)
{
    var treeViewItem = FindAnchestor<TreeViewItem>((DependencyObject)e.OriginalSource);
}
 类似资料:
  • Am使用带有TreeView控件的WPF XBAP应用程序。Treeview有一个自定义的ItemContainerStyle,并使用分层数据绑定。当我最小化运行XBAP的浏览器并再次最大化它,然后单击TreeView中的一个项目时,该项目没有被选中(即。下面是我在TreeViewItem中使用的样式: 提前谢谢你的帮助。

  • 我有一个JComboBox选择项目的问题,有人能帮我吗?我已经实现了一个图形用户界面窗口,其中有各种文本字段和一个JComboBox。当我点击按钮,代码必须创建一个对象与字符串的文本字段和字符串的ComboBox,但我有一个在...获取的代码是: 我也试过: 但是不要工作!我不知道我是否需要一个ActionListener,但我认为这不是必需的。

  • 我有一个2级WPF树景。当我单击一个子项时,正确的selectedCommand被触发,并且一切正常。 但是当我单击我的详细信息视图并更新此选定项目的字段时,它取消选择我的子项目并触发父命令,因为父项目已被选中,但我需要保持我的子项目已被选中。 我已经找到了一些关于同一问题的主题,但我使用命令进行绑定,而不仅仅是代码隐藏,所以我不知道如何使这个解决方案适合我。 Dispacher。BeginInv

  • 如何获取selectbox当前选中的选项值? 我尝试了下面的代码,但它不起作用。 任何帮助都将不胜感激。

  • 问题内容: 我正在尝试使用treeView创建菜单。这是我第一次使用treeView,并且已经在多个网站上进行了阅读。 我在进行动作事件时遇到一些问题。我想要做的基本上是在用户单击树形视图中的某个节点时触发并发生事件,到目前为止,我有以下内容: 不幸的是,这似乎不起作用。 有什么方法可以在不更改类型的情况下将甚至添加到单个项目? 问题答案: 根据JavaFX 2.2文档 : “..A TreeIt

  • 注意:我实际上不确定为什么这种情况首先需要监听器,因为我甚至不想经常监听,而是在调用方法时得到结果。