Удаление элемента из TreeView

463
12 февраля 2017, 09:28

Подскажите как сделать удаление выделенного элемента из 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; }
}
Answer 1

Сделаю пример с использованием 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="Удалить элемент">
Answer 2

Создайте свойство

public TreeElem SelectedTreeElem { get; set; }

привяжите его

<TreeView x:Name="PrjTreeViev" ItemsSource="{Binding tree_contents}" SelectedItem="{Binding SelectedTreeElem}">

Тогда выбранный элемент можно удалить так

//тут прежде надо на null проверить SelectedTreeElem
tree_contents.Remove(SelectedTreeElem);
SelectedTreeElem = null;
READ ALSO
Отображение приложения на разных OS

Отображение приложения на разных OS

Есть ли какой то способ, для того что бы приложения на WinForms или WPF начиная с XP и дальше до 10, выглядели одинаково? Есть иногда даже разница между...

366
Логика добавления записи в базы данных Access

Логика добавления записи в базы данных Access

Разъясните логику записи строки в базу

299
Мониторинг изменений в реестре

Мониторинг изменений в реестре

Не выводит запись об изменения в реестре ( вывод в консоль ) По этой статье + примере на программе: RegistryMonitor

286