如何使用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)
将不工作)?我试过了:
- 获取所选项目的父节点(例如,Molecules是Molecule的父节点),但是wpf-TreeVew中没有方法获取父节点。
- MyTreeView.Items.Remove(MyTreeView.SelectedItem) -错误:当ItemsSource正在使用时,操作无效
在我的ItemOfWorld类中添加额外的字段:
public ItemOfWorld Parent;
,这将像指向父类的指针一样使用。我原以为可以这样解决这个问题:(MyTreeVew.SelectedItem as ItemOfWorld).Parent.Items.Remove(MyTreeVew.SelectedItem);
,但是对于我的应用来说,分子数量会非常大,所以我最好尽量避免这种"解决方案",希望在您的帮助下找到更智能的解决方案!也许我必须以某种方式改变ItemsSource链接?任何提示或想法将不胜感激!谢谢!
直接从ObservableCollection
中删除您的项目:
Items.Remove(MyTreeView.SelectedItem);
好了,伙计们,我想我找到这个问题的解决方案了。主要思想是——在WPF-TreeView中,有些方法确实缺失了,这是没有原因的。所以,我们必须设计它。我已经找到了一个好人,他已经写了一些额外的扩展方法:谢谢你,Reinhard Ostermeier先生!他的库提供了将父项获取到其他项的可能性。
但是我有一个问题。它是可以的,如果我将保持指针在每个孩子的父类?在这种情况下,我的意思是添加字段ItemOfWorld类(见问题№3):public ItemOfWorld Parent
。如果我们尝试比较这两种解决方案(内存使用、速度等),哪个更好?