Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF如何在selecteditemchanged事件上获取选定的TreeView项目?_C#_Wpf_Xaml - Fatal编程技术网

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

C# WPF如何在selecteditemchanged事件上获取选定的TreeView项目?,c#,wpf,xaml,C#,Wpf,Xaml,事件的发送者是treeviewitem中的对象。但是,它不是dependencyobject,因此我认为不能使用ItemFromContainer来获取实际的TreeViewItem。我应该怎么做才能获得所选的实际TreeView项目 我看到每个人都被我的问题弄糊涂了,就像我被我的问题弄糊涂了一样 根据链接的站点,我可以从selecteditem属性获取我的treeviewitem。但是,当我尝试执行此操作时,会得到null,因为发送方是SignalViewModel对象,而不是TreeView

事件的发送者是treeviewitem中的对象。但是,它不是dependencyobject,因此我认为不能使用ItemFromContainer来获取实际的TreeViewItem。我应该怎么做才能获得所选的实际TreeView项目

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

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

TreeViewItem treeViewItem = this.AvailableSignalsTreeView.SelectedItem as TreeViewItem;
这将为我返回null,但调试器显示所选项的类型为SignalViewModel

我所要做的就是为treeview获得multiselect功能,我将使用我看到的一个只切换treeview项的示例来实现这一点

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

试试这个:

// 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);
}
//帮助搜索VisualTree
专用静态T Findanchester(DependencyObject当前)
其中T:DependencyObject
{
做
{
如果(电流为T)
{
返回(T)电流;
}
当前=VisualTreeHelper.GetParent(当前);
}
while(当前!=null);
返回null;
}
私有无效可用SignalsTreeView\u SelectedItemChanged(
对象发送器,
RoutedPropertyChangedEventArgs(e)
{
var treeViewItem=findanchester((DependencyObject)e.OriginalSource);
}

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

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

TreeViewItem tvi = tv.ItemContainerGenerator.ContainerFromItem(tv.SelectedItem) as TreeViewItem;  

您需要这样的内容:
var item=e.OriginalSource作为IteemYouExpect
。在IteemYouExpect中,您可以键入
图像、按钮
,无论您希望项目是什么。希望我理解您的问题。TreeView.SelectedItem?模板制作的顺序是什么?我假设顺序是,创建treeview,将控制模板应用于treeview,创建treeview项,将控制模板应用于treeview项,然后将数据模板应用于放置在数据模板中的内容。不知道为什么我昨天没有在树上搜索它,但我想我很困惑,认为我需要使用getcontainerfromitem或其他东西来获取treeviewitem。事实上,我认为这行不通。e、 OriginalSource不包含treeview项目的内容,而是包含treeview本身。