J'écris un ItemsControl
personnalisé (un conteneur de document à onglets), où chaque élément (onglet) peut se retirer de l'interface utilisateur lorsque l'utilisateur le ferme. Toutefois, je ne peux pas le supprimer directement de la collection ItemsControl.Items
, car les éléments peuvent être databound. Je dois donc le retirer du ItemsSource
, qui peut être n'importe quoi (ICollection
, DataTable
, DataSourceProvider
...).WPF - Meilleure façon de supprimer un élément de ItemsSource
Dans le contexte de mon application, je sais quel sera le type réel du ItemsSource
, mais je veux que ce contrôle soit plus générique pour que je puisse le réutiliser plus tard. Je cherche donc un moyen de supprimer un élément d'une source de données, sans connaître son type. Je pourrais utiliser la réflexion, mais il se sent sale ... Jusqu'à présent, la meilleure solution que je suis venu avec l'aide est 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());
}
}
Mais je ne suis pas vraiment satisfait, je suis sûr qu'il doit y avoir un meilleure façon. Toute suggestion serait appréciée !
En fait, une bonne conception assurerait la 'ItemsControl' n'a pas connaissance des types dans 'ItemsSource' du tout. –
Je serais d'accord si j'avais le contrôle total sur cette propriété ItemsSource ... mais je ne le fais pas. Il fait partie de WPF, est de type 'object' et peut être tout ce qui supporte l'énumération. Et mon contrôle est conçu pour accepter n'importe quoi, je ne veux pas me limiter à un type spécifique –
Down-vote pourquoi ?? – Noldorin