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

时间:2014-06-15 11:24:32

标签: c# wpf treeview

我是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());
    }
}

然后我在TreeVew中有HierarchicalDataTemplate,如下所示:

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&#39;类型,因此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);但是对于我的应用,分子的数量会非常大,所以如果我试图避免这种&#34;解决方案会更好。我希望能在你的帮助下找到更智能的解决方案!

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

2 个答案:

答案 0 :(得分:0)

直接从ObservableCollection删除您的项目:

Items.Remove(MyTreeView.SelectedItem);

答案 1 :(得分:-1)

好的,伙计们,我想我找到了解决这个问题的方法。主要思想 - 在WPF-TreeView中,一些方法确实缺失,没有理由。所以,我们必须设计它。我找到了好人,他已经写了一些额外的扩展方法:thank you, mister Reinhard Ostermeier!。他的图书馆提供了将父项目送到其他项目的可能性。

但我有一个问题。没关系,如果我会在每个孩子中保留指向父类的指针?在这种情况下,我的意思是向ItemOfWorld类添加字段(参见问题№3):public ItemOfWorld Parent。如果我们试图比较这两个解决方案(内存使用,速度等) - 什么更好?