Escribo un ItemsControl
personalizado (un contenedor de documentos con pestañas), donde cada elemento (pestaña) puede eliminarse de la UI cuando el usuario lo cierra. Sin embargo, no puedo eliminarlo directamente de la colección ItemsControl.Items
, porque los elementos pueden estar enlazados a datos. Así que tengo que eliminarlo de ItemsSource
, que puede ser cualquier cosa (ICollection
, DataTable
, DataSourceProvider
...).WPF: la mejor manera de eliminar un elemento de ItemsSource
En el contexto de mi aplicación, sé cuál será el tipo real de ItemsSource
, pero quiero que ese control sea más genérico para poder reutilizarlo más adelante.
Así que estoy buscando una manera de eliminar un elemento de una fuente de datos, sin saber su tipo. Podría utilizar la reflexión, pero se siente sucia ... Hasta ahora la mejor solución que se me ocurrió es usar 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());
}
}
Pero no estoy muy contenta con ella, estoy seguro de que debe haber una mejor manera. Cualquier sugerencia sera apreciada !
En realidad, el buen diseño aseguraría la 'ItemsControl' no tiene conocimiento de los tipos en 'ItemsSource' en absoluto. –
Estoy de acuerdo si tuviera control total sobre esa propiedad ItemsSource ... pero no es así. Es parte de WPF, es de tipo 'objeto', y puede ser cualquier cosa que admita la enumeración. Y mi control está diseñado para aceptar cualquier cosa, no quiero limitarme a un tipo específico –
¿Por qué? – Noldorin