【发布时间】:2010-07-17 13:06:18
【问题描述】:
我正在编写一个自定义的ItemsControl(一个选项卡式文档容器),其中每个项目(选项卡)都可以在用户关闭它时从 UI 中移除。但是,我不能直接从ItemsControl.Items 集合中删除它,因为这些项目可以是数据绑定的。所以我必须从ItemsSource 中删除它,它可以是任何东西(ICollection、DataTable、DataSourceProvider...)。
在我的应用程序上下文中,我知道 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());
}
}
但我对此并不满意,我相信一定有更好的方法。任何建议将不胜感激!
【问题讨论】:
标签: wpf itemscontrol itemssource