Удаление из неизвестного ListBoxes ItemsSource - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть окно с несколькими списками ListBox, каждый ListBox использует одно и то же событие KeyDown, чтобы определить, была ли нажата кнопка удаления для выделенной записи.Мне нужно получить ссылку на выбранный связанный источник ListBox, чтобы я мог удалить из него выбранное значение и увидеть объект с:

var sourceObject = box.ItemsSource;

это просто возвращает IEnumerable список элементов, привязанных к ListBox.

Как я могу получить привязанное свойство источника (ссылка), чтобы я мог удалить базовое значение?

Вот xaml:

<ListBox x:Name="listTest1" ItemsSource="{Binding AllTest1Values}" HorizontalAlignment="Left" Height="60" Margin="341,390,0,0" VerticalAlignment="Top" Width="156" KeyDown="ListBox_KeyDown">

<ListBox x:Name="listTest2" ItemsSource="{Binding AllTest2Values}" HorizontalAlignment="Left" Height="60" Margin="341,390,0,0" VerticalAlignment="Top" Width="156" KeyDown="ListBox_KeyDown">

<ListBox x:Name="listTest3" ItemsSource="{Binding AllTest3Values}" HorizontalAlignment="Left" Height="60" Margin="341,390,0,0" VerticalAlignment="Top" Width="156" KeyDown="ListBox_KeyDown">

Как видите, Событие всегда одинаково, но привязка различна.Вот почему мне нужно найти способ получить ссылку на привязку в обработчике события ListBox_KeyDown.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Как я могу получить привязанное исходное свойство (ссылку), чтобы я мог удалить базовое значение?

box.ItemsSource дает вам ссылку на исходную коллекцию.Но так как тип свойства ItemsSource равен IEnumerable, вам нужно привести значение к чему-то, что поддерживает удаление элементов, прежде чем вы сможете удалить любой элемент.Интерфейс ICollection<T> должен работать.Это реализовано, например, List<T> и ObservableCollection<T>.

var x = box.ItemsSource as ICollection<string>;
if (x != null)
    x.Remove("...");
0 голосов
/ 08 февраля 2019

В общем, вам понадобится контекст данных.

// {Event} needs to be replaced with your event name, such as Click
// {BindingClass} need to be replaced with the name of your binding class, such as ListBoxItems

private void ListBox_{Event}(object sender, RoutedEventArgs e)
{
    var listbox = (FrameworkElement)sender;
    var dataContext = ({BindingClass})listbox.DataContext;
}

Выше ваш обработчик событий предоставит отправителя, и если это FrameworkElement, вы сможете его привести и получить объект списка.Оттуда вы можете проверить свойство DataContext и привести его к какому-либо классу привязки.

Альтернативный дизайн - создать подкласс компонента ListBox и добавить собственное свойство, чтобы выразить источник привязки наиболее удобным для вас способом.Таким образом, у вас будет доступ к этому свойству в универсальном обработчике событий, и вам не придется беспокоиться о попытке использовать отражение или другие методы, чтобы выяснить, что такое исходный объект привязки ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...