【问题标题】:WPF how do i get the selected treeviewitem on selecteditemchanged event?WPF 如何在 selecteditemchanged 事件中获取选定的树视图项?
【发布时间】:2013-08-14 10:03:51
【问题描述】:

事件的发送者是treeviewitem中的对象。但是,它不是一个依赖对象,所以我认为我不能使用 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>

【问题讨论】:

  • 你想要这样的东西:var item = e.OriginalSource as TheItemYouExpect。在 TheItemYouExpect 中你可以输入Image,Button,无论你期望的项目是什么。希望我能理解你的问题。
  • TreeView.SelectedItem? msdn.microsoft.com/en-us/library/…

标签: c# wpf xaml


【解决方案1】:

试试这个:

// 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);
}

【讨论】:

  • 模板的顺序是什么?我假设顺序类似于,创建树视图,将控件模板应用于树视图,创建树视图项,为树视图项应用控制模板,然后将数据模板应用于放置在数据模板中的内容。不知道为什么我昨天不只是在树上搜索它,但我想我很困惑,认为我需要使用 getcontainerfromitem 或其他东西来获取 treeviewitem。
  • 实际上我认为这行不通。 e.OriginalSource 不包含树视图项的内容,而是包含树视图本身。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    相关资源
    最近更新 更多