SelectedItemChanged事件绑定到ObservableCollection <tuple <string,object =“”>&gt; </tuple <string,>

时间:2011-12-20 12:55:23

标签: c# tuples selecteditemchanged

这是ObservableCOllection,它是我的TreeView的“ItemSource”:

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 个答案:

答案 0 :(得分:1)

为什么不将e.NewValue强制转换为你的元组?

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

使用as运算符确保如果转换失败,您的元组将为null!

答案 1 :(得分:0)

只需将e.NewValue转换为正确的类型:

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

当然这会产生一个异常使用的演员,但这完全是另一个问题。您可以按原样使用它,因为它可以在此特定方案中使用,或者如果您打算将此处理程序用于其他项类型,则可以将其抽象化。