Событие 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;
}

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

Другие вопросы по тегам