gpt4 book ai didi

WPF - 从 ItemsSource 中删除项目的最佳方法

转载 作者:行者123 更新时间:2023-12-04 17:41:16 29 4
gpt4 key购买 nike

我正在写一个自定义 ItemsControl (一个选项卡式文档容器),其中每个项目(选项卡)都可以在用户关闭它时从 UI 中移除。但是,我不能直接从 ItemsControl.Items 中删除它。集合,因为这些项目可以是数据绑定(bind)的。所以我必须从 ItemsSource 中删除它,可以是任何东西(ICollectionDataTableDataSourceProvider ...)。

在我的应用程序的上下文中,我知道 ItemsSource 的实际类型是什么会的,但我希望该控件更通用,以便以后可以重用它。

所以我正在寻找一种方法来从数据源中删除一个项目,而不知道它的类型。我可以使用反射,但感觉很脏......到目前为止,我想出的最佳解决方案是使用 dynamic :

    internal void CloseTab(TabDocumentContainerItem tabDocumentContainerItem)
{
// TODO prompt user for confirmation (CancelEventHandler ?)

var item = ItemContainerGenerator.ItemFromContainer(tabDocumentContainerItem);

// TODO find a better way...
try
{
dynamic items = ItemsSource;
dynamic it = item;
items.Remove(it);
}
catch(RuntimeBinderException ex)
{
Trace.TraceError("Oops... " + ex.ToString());
}
}

但我对此并不满意,我相信一定有更好的方法。任何建议,将不胜感激 !

最佳答案

ItemCollectionItemsControl.Items 返回不允许您直接调用 Remove,但它实现了 IEditableCollectionView 并且允许您在该接口(interface)中调用 Remove 方法。

这只有在 Collection View 绑定(bind)到 ItemsSource 时才有效。实现 IEditableCollectionView本身。默认 Collection View 适用于大多数可变集合,但不适用于实现 ICollection 的对象。但不是 IList .

IEditableCollectionView items = tabControl.Items; //Cast to interface
if (items.CanRemove)
{
items.Remove(tabControl.SelectedItem);
}

关于WPF - 从 ItemsSource 中删除项目的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3271576/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com