Получение TreeViewItem для выбранного элемента в TreeView
У меня есть TreeView, привязанный к набору данных, который имеет родительское дочернее отношение. Как я получу TreeViewItem из TreeView? Пожалуйста, помогите мне. Мой код ниже.
XAML: -
<TreeView Name="tvPersonal" Background="Transparent" ItemsSource="{Binding RootNodes}" SelectedItemChanged="tvPersonal_SelectedItemChanged">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding rsParentChild}">
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
public MainWindow()
{
InitializeComponent();
DataSet ds = new BL.BLMenu().GetAllMenues(new BOModule { Name = Modules.Personnel });
ds.Tables[0].TableName = "Menu";
DataRelation relation = new DataRelation("rsParentChild",
ds.Tables["Menu"].Columns["MenuId"],
ds.Tables["Menu"].Columns["ParentId"]);
relation.Nested = true;
ds.Relations.Add(relation);
BOMenu mnu = new BOMenu();
BOMenu.RootNodes = ds.Tables["Menu"].DefaultView;
BOMenu.RootNodes.RowFilter = "ParentId IS NULL";
this.DataContext = this;
stbiDate.Content = DateTime.Now;
}
public DataView RootNodes
{
get { return BOMenu.RootNodes; }
}
Класс BOMenu: -
public class BOMenu
{
public string MenuId
{
get;
set;
}
public string Name
{
get;
set;
}
public string ParentId
{
get;
set;
}
public int Priority
{
get;
set;
}
public static DataView RootNodes
{
get;
set;
}
}
Ответы
Ответ 1
Try
TreeViewItem tvi = myTree.ItemContainerGenerator.ContainerFromItem(SelectedItem) as TreeViewItem;
или перейдите по ссылкам ниже. Надеемся, что это поможет
Связывание данных с SelectedItem в виде дерева WPF
Получить SelectedItem из TreeView?
http://social.msdn.microsoft.com/forums/en-US/wpf/thread/36aca7f7-0b47-488b-8e16-840b86addfa3/
Ответ 2
Это работает для деревьев, источник данных которых связан через HierarchicalDataTemplate
Обработать TreeViewItem.Selected
<TreeView Name="mTreeView" TreeViewItem.Selected="TreeViewItem_OnItemSelected" />
И установите TreeViewItem как тег.
private void TreeViewItem_OnItemSelected(object sender, RoutedEventArgs e)
{
mTreeView.Tag = e.OriginalSource;
}
Что вы можете получить позже
TreeViewItem tvi = mTreeView.Tag as TreeViewItem;
Ответ 3
В то время как ответ biju работает для плоских иерархий, мне пришлось искать решение для HierarchicalDataTemplates. Это метод расширения, который работал у меня:
public static TreeViewItem ContainerFromItemRecursive(this ItemContainerGenerator root, object item)
{
var treeViewItem = root.ContainerFromItem(item) as TreeViewItem;
if (treeViewItem != null)
return treeViewItem;
foreach (var subItem in root.Items)
{
treeViewItem = root.ContainerFromItem(subItem) as TreeViewItem;
var search = treeViewItem?.ItemContainerGenerator.ContainerFromItemRecursive(item);
if (search != null)
return search;
}
return null;
}
Вы можете использовать его с помощью
TreeViewItem tvi = treeView
.ItemContainerGenerator
.ContainerFromItemRecursive(treeView.SelectedItem);
Ответ 4
Лучшее решение, которое я нашел, включает простой вспомогательный метод и может использоваться практически в любом из событий TreeView (т.е. SelectedItemChanged, MouseLeftButtonUp и т.д.).
TreeViewItem Item = TreeViewHelper.VisualUpwardSearch(e.OriginalSource as DependencyObject);
Я использую несколько шаблонов данных иерархии, и это метод only, который работал у меня. Теперь я могу создать новый элемент управления на основе TreeView и может обрабатывать все события, связанные с выбранным элементом внутри.
public static TreeViewItem VisualUpwardSearch(DependencyObject source)
{
while (source != null && !(source is TreeViewItem)) source = System.Windows.Media.VisualTreeHelper.GetParent(source);
return source as TreeViewItem;
}