События WPF ListBoxItem

Один из тех вопросов «Почему это так сложно?».

У меня есть ListBox (содержащий информацию о портфелях акций). Элемент списка использует сетку для отображения атрибутов портфолио. Источник — это список портфелей в модели представления.

ListBox это множественный выбор - при изменении выбора список составляющих выбранных портфелей заполняется заново.

Что я хочу сделать, так это поместить кнопку (или меню или что-то еще) в элемент списка, чтобы отобразить список возможных действий (торговля, объединение, удаление и т. д.).

Когда действие выбрано, мне нужно выполнить действие в отношении соответствующего портфеля. В идеале я хочу, чтобы действия были доступны как для выбранных, так и для невыбранных элементов.

Я могу обработать это событие, но как определить, какой элемент (портфолио) выбрал пользователь? Я посмотрел на GotFocus(), но, похоже, он не срабатывает.

Другими словами, если элемент управления в Listboxitem запускает событие, как событие «узнает», какое ListBoxItem его вызвало?


person Phil Clarke    schedule 15.01.2018    source источник


Ответы (2)


Для меня решение здесь, как вы упомянули MVVM, состояло бы в том, чтобы ListBox заполнялся набором ViewModels, например, что-то вроде ObservableCollection<PortfolioViewModel>.

Тогда это будет просто случай привязки свойства Command Button к ICommand в ViewModel, который выполняет любую работу, которую вам нужно выполнить.

person Chris Mack    schedule 15.01.2018
comment
Мне кажется, я понимаю, откуда ты. В настоящее время список привязан к коллекции класса Portfolio, которая содержит только свойства (Id, Name, Value....), но нет никаких причин, по которым класс не может также содержать методы или команды. Я раскрутю его, посмотрим, полетит ли он. Спасибо, Крис. - person Phil Clarke; 16.01.2018

Я могу обработать это событие, но как определить, какой элемент (портфолио) выбрал пользователь? Я посмотрел на GotFocus(), но он не срабатывает.

Вы можете привести DataContext щелкнутого Button к соответствующему объекту в te ListBox, например:

private void DeleteButton_Clicked(object sender, RoutedEventArgs e)
{
    Button deleteButton = sender as Button;
    var portfolio = deleteButton.DataContext as Portfolio; //or whatever your type is called

    //access any members of the portfolio...
}
person mm8    schedule 16.01.2018