Подскажите как сделать удаление выделенного элемента из TreeView? (находящегося не на самом верхнем уровне)
Как я понимаю - нужно каким то образом получить родителя элемента?
XAML для TreeView:
<TreeView x:Name="PrjTreeViev">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=Elems}">
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
Привязывается к:
ObservableCollection<TreeElem> tree_contents; //элементы TreeView для отображения
PrjTreeViev.ItemsSource = tree_contents;
...
public class TreeElem //класс с списком для отображения
{
public string Name { get; set; }
public ObservableCollection<TreeElem> Elems { get; set; }
}
Сделаю пример с использованием MVVM паттерна Catel.
XAML:
<TreeView x:Name="PrjTreeViev" SelectedItem="{Binding SelectedItemTreeView}" ItemsSource="{Binding TreeViewSource, IsAsync=True}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=Elems}">
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
Теперь перейдем к коду ViewModel
C#
/// <summary>
/// Регистрируем TreeViewSourceProperty
/// </summary>
public static readonly PropertyData TreeViewSourceProperty = RegisterProperty("TreeViewSource", typeof(List<TreeElem>));
/// <summary>
/// Установка, получение значений из TreeViewSource
/// </summary>
public List<TreeElem> TreeViewSource
{
get { return GetValue<List<TreeElem>>(TreeViewSourceProperty); }
set { SetValue(TreeViewSourceProperty, value); }
}
/// <summary>
/// Регистрируем SelectedItemTreeViewProperty
/// </summary>
public static readonly PropertyData SelectedItemTreeViewProperty = RegisterProperty("SelectedItemTreeView", typeof(TreeElem));
/// <summary>
/// Установка, получение значений из SelectedItemTreeView
/// </summary>
public TreeElem SelectedItemTreeView
{
get { return GetValue<TreeElem>(SelectedItemTreeViewProperty); }
set { SetValue(SelectedItemTreeViewProperty, value); }
}
public class TreeElem //класс с списком для отображения
{
public string Name { get; set; }
public ObservableCollection<TreeElem> Elems { get; set; }
}
Так же сделаем команду для для удаления, которая будет недоступна если не выделен элемент.
public ICatelCommand DeletSelectedNode => new TaskCommand<TreeElem>(node => Task.Run(() =>
{
if(MessageBox.Show($"Уверены что хотите удалить данный элмент {node.Name}?", "Подтвердите действие", MessageBoxButton.YesNo, MessageBoxImage.Information) == MessageBoxResult.Yes)
TreeViewSource.Remove(node); /// Удаляем, если пользователь согласился
}), node => SelectedItemTreeView != null); /// Команда не будет доступна если не выбран элемент в TreeView
После всех этих операция создаем кнопку, или контекстное меню, в которых создаем биндинг на нашу команду.
XAML:
<Button Command="{Binding DeletSeletedNode}" CommandParametr="{Binding ElementName=PrjTreeViev, Path=SelectedItem}", Content="Удалить элемент">
Создайте свойство
public TreeElem SelectedTreeElem { get; set; }
привяжите его
<TreeView x:Name="PrjTreeViev" ItemsSource="{Binding tree_contents}" SelectedItem="{Binding SelectedTreeElem}">
Тогда выбранный элемент можно удалить так
//тут прежде надо на null проверить SelectedTreeElem
tree_contents.Remove(SelectedTreeElem);
SelectedTreeElem = null;
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть ли какой то способ, для того что бы приложения на WinForms или WPF начиная с XP и дальше до 10, выглядели одинаково? Есть иногда даже разница между...
Не выводит запись об изменения в реестре ( вывод в консоль ) По этой статье + примере на программе: RegistryMonitor