Я пишу пользовательский ItemsControl
(контейнер документов с вкладками), где каждый элемент (вкладка) может удалить себя из пользовательского интерфейса, когда пользователь закрывает его.Однако я не могу удалить его непосредственно из коллекции 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());
}
}
Но я не очень доволен этим, я уверендолжен быть лучший способ.Любые предложения будут оценены!