Событие SelectedItemChanged связывается с коллекцией ObservableCollection> - PullRequest
1 голос
/ 20 декабря 2011

Вот 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 ]

1 голос
/ 20 декабря 2011

Почему бы не привести значение e.NewValue к вашему кортежу?

private void plugin_Selected(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    Tuple<string, object> tuple = e.NewValue as Tuple<string, object>;
}

Использование оператора as гарантирует, что в случае сбоя преобразования ваш кортеж будет нулевым!

0 голосов
/ 20 декабря 2011

Просто приведите e.NewValue к правильному типу:

private void plugin_Selected(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    var tuple = (Tuple<string, object>)e.NewValue;
    var item2 = tuple.Item2;
}

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

...