如何使用ItemsSource在WPF-treeview中删除项目

本文关键字:删除项目 WPF-treeview 何使用 ItemsSource | 更新日期: 2023-09-27 18:08:36

我对WPF有点陌生,所以你会发现我的问题有点奇怪。想象一下,我们有一个类:

public class ItemOfWorld
{
    public ObservableCollection<ItemOfWorld> Items { get; set; }
    public string Name { get; set; }
    public virtual void AddItem() { }
    public ItemOfWorld()
    {
        this.Items = new ObservableCollection<ItemOfWorld>();
    }
}
public class Molecules : ItemOfWorld
{
    public Molecules(): base()
    {
        Name = "Molecules";
    }
    public override void AddItem()
    {
        this.Items.Add(new Molecule());
    }
}

然后我有HierarchicalDataTemplate在treview像这样:

HierarchicalDataTemplate DataType="{x:Type pcsadd:ItemOfWorld}" ItemsSource="{Binding Items}">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Name}" />
                    <TextBlock Text="{Binding Items.Count}" Foreground="Blue" />
                    </StackPanel>
            </HierarchicalDataTemplate>

问题是:我如何删除SelectedItem的对象(在这种情况下与ItemOfWorld的类型,所以MyTreeView.Items.Remove(MyTreeView.SelectedItem)将不工作)?我试过了:

  1. 获取所选项目的父节点(例如,Molecules是Molecule的父节点),但是wpf-TreeVew中没有方法获取父节点。
  2. MyTreeView.Items.Remove(MyTreeView.SelectedItem) -错误:当ItemsSource正在使用时,操作无效
  3. 在我的ItemOfWorld类中添加额外的字段:public ItemOfWorld Parent;,这将像指向父类的指针一样使用。我原以为可以这样解决这个问题:(MyTreeVew.SelectedItem as ItemOfWorld).Parent.Items.Remove(MyTreeVew.SelectedItem);,但是对于我的应用来说,分子数量会非常大,所以我最好尽量避免这种"解决方案",希望在您的帮助下找到更智能的解决方案!

    也许我必须以某种方式改变ItemsSource链接?任何提示或想法将不胜感激!谢谢!

如何使用ItemsSource在WPF-treeview中删除项目

直接从ObservableCollection中删除您的项目:

Items.Remove(MyTreeView.SelectedItem);

好了,伙计们,我想我找到这个问题的解决方案了。主要思想是——在WPF-TreeView中,有些方法确实缺失了,这是没有原因的。所以,我们必须设计它。我已经找到了一个好人,他已经写了一些额外的扩展方法:谢谢你,Reinhard Ostermeier先生!他的库提供了将父项获取到其他项的可能性。

但是我有一个问题。它是可以的,如果我将保持指针在每个孩子的父类?在这种情况下,我的意思是添加字段ItemOfWorld类(见问题№3):public ItemOfWorld Parent。如果我们尝试比较这两种解决方案(内存使用、速度等),哪个更好?