Я пишу пользовательский ItemsControl
(контейнер с вкладками), где каждый элемент (вкладка) может удаляться из пользовательского интерфейса, когда пользователь его закрывает. Однако я не могу удалить его непосредственно из коллекции ItemsControl.Items
, поскольку элементы могут быть привязаны к базе данных. Поэтому я должен удалить его с ItemsSource
, который может быть любым (ICollection
, DataTable
, DataSourceProvider
...).WPF - Лучший способ удалить элемент из ItemsSource
В контексте моего приложения я знаю, что будет с фактическим типом 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());
}
}
Но я не очень счастлива с ним, я уверен, что должно быть лучший путь. Мы ценим любые предложения !
На самом деле, хороший дизайн будет гарантировать, что 'ItemsControl' не имеет знание типов в «ItemsSource» вообще. –
Я бы согласился, если бы у меня был полный контроль над этим свойством ItemsSource ... но я этого не делаю. Это часть WPF, имеет тип 'object' и может быть любым, что поддерживает перечисление. И мой контроль призван принять что угодно, я не хочу ограничивать себя определенным типом –
Down-vote why ?? – Noldorin