Ich schreibe eine benutzerdefinierte ItemsControl
(ein Container mit Registerkarten), wo jedes Element (Registerkarte) kann sich selbst von der Benutzeroberfläche entfernen, wenn der Benutzer es schließt. Ich kann es jedoch nicht direkt aus der Sammlung ItemsControl.Items
entfernen, da die Elemente datengebunden sein können. Also muss ich es aus dem ItemsSource
entfernen, was alles sein kann (ICollection
, DataTable
, DataSourceProvider
...).WPF - Die beste Methode zum Entfernen eines Elements aus der ItemsSource
Im Zusammenhang mit meiner Anwendung weiß ich, was der eigentliche Typ der ItemsSource
wird, aber ich möchte, dass die Steuerung generischer ist, so dass ich es später wiederverwenden kann.
So suche ich nach einer Möglichkeit, ein Element aus einer Datenquelle zu entfernen, ohne seinen Typ zu kennen. Ich konnte Reflexion verwenden, aber es fühlt sich schmutzig ... So weit die beste Lösung kam ich mit verwendet 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());
}
}
Aber ich bin nicht wirklich glücklich mit ihm, ich bin sicher, dass es eine sein muss besserer Weg. Irgendwelche Vorschläge würden geschätzt!
Eigentlich wäre ein gutes Design sorgen für die 'ItemsControl' hat keine Kenntnis der Typen in der ItemsSource überhaupt. –
Ich würde zustimmen, wenn ich die volle Kontrolle über diese ItemsSource-Eigenschaft hätte ... aber ich nicht. Es ist Teil von WPF, hat den Typ "Objekt" und kann alles sein, was Aufzählung unterstützt. Und meine Kontrolle ist darauf ausgelegt, alles zu akzeptieren, ich möchte mich nicht auf einen bestimmten Typ beschränken –
Down-vote why ?? – Noldorin