我正在编写一个自定义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());
}
}
但我对此并不满意,我相信一定有更好的方法。任何建议,将不胜感激 !