Событие SelectedItemChanged связывается с коллекцией ObservableCollection<Tuple <string, object >>
Вот ObservableCOllection, что это "ItemSource" моего TreeView:
ObservableCollection<Tuple<string, object>>
Дело в том, что я сейчас пишу SelectedItemChanged
Событие и я получил следующую проблему. Насколько я пытался, я не могу получить ничего, кроме как для объявления моей функции:
private void plugin_Selected(object sender, RoutedPropertyChangedEventArgs<object> e)
(и я получил следующий код в xaml:
SelectedItemChanged="plugin_Selected"
)
Дело в том, что когда я делаю
e.NewValue.GetType()
конечно я получил Tuple<string, object>
но в моем plugin_Selected я ДОЛЖЕН получить доступ к Item2 (объекту моего кортежа). Логическая вещь, которая пришла мне в голову, была переписать мою функцию:
private void plugin_Selected(object sender, RoutedPropertyChangedEventArgs<Tuple<string, object>> e)
но я получил следующую ошибку:
No overload for 'plugin_Selected' matches delegate 'System.Windows.RoutedPropertyChangedEventHandler<object>'
Итак, что я могу сделать, чтобы получить доступ к значениям Item1 (строка) и Item2 (объект) моего кортежа?
РЕДАКТИРОВАТЬ: я получил этот тест, который может быть способом решения проблемы
if (e.NewValue.GetType() == typeof(Tuple<string, object>))
но я не знаю, что делать дальше, вызвать что-то вроде:
object MyObject = = e.NewValue.Item2;
не компилируется...:(
2 ответа
Почему бы не привести e.NewValue к вашему кортежу?
private void plugin_Selected(object sender, RoutedPropertyChangedEventArgs<object> e)
{
Tuple<string, object> tuple = e.NewValue as Tuple<string, object>;
}
С использованием as
оператор гарантирует, что в случае сбоя приведения ваш кортеж будет нулевым!
Просто брось e.NewValue
на правильный тип:
private void plugin_Selected(object sender, RoutedPropertyChangedEventArgs<object> e)
{
var tuple = (Tuple<string, object>)e.NewValue;
var item2 = tuple.Item2;
}
Конечно, это приведет к тому, что исключение будет использовано неправильно, но это совсем другая проблема. Вы можете использовать его как есть, потому что он будет работать в этом конкретном сценарии, или абстрагировать его, если вы собираетесь использовать этот обработчик и для других типов элементов.