【问题标题】:SelectedItemChanged Event bind to an ObservableCollection<Tuple<string, object>>SelectedItemChanged 事件绑定到 ObservableCollection<Tuple<string, object>>
【发布时间】:2011-12-20 12:55:23
【问题描述】:

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

ObservableCollection<Tuple<string, object>>

问题是我现在正在编写SelectedItemChanged 事件,我遇到了以下问题。就我的尝试而言,除了函数声明之外,我什么也得不到:

private void plugin_Selected(object sender, RoutedPropertyChangedEventArgs<object> e)

(我在 xaml 中得到了以下代码:

SelectedItemChanged="plugin_Selected"

)

问题是当我这样做时

e.NewValue.GetType()

当然,我有一个Tuple&lt;string, object&gt;,但在我的 plugin_Selected 中,我必须访问 Item2(我的 Tuple 的对象) 我想到的合乎逻辑的事情是用以下代码重写我的函数:

private void plugin_Selected(object sender, RoutedPropertyChangedEventArgs<Tuple<string, object>> e)

但我收到以下错误:

No overload for 'plugin_Selected' matches delegate 'System.Windows.RoutedPropertyChangedEventHandler<object>'

那么,如何访问我的 Tuple 的 Item1(字符串)和 Item2(对象)值?

编辑:我得到了这个测试,可能是解决问题的一种方法

if (e.NewValue.GetType() == typeof(Tuple<string, object>))

但我不知道下一步该做什么,原因如下:

object MyObject =  = e.NewValue.Item2;

无法编译... :(

【问题讨论】:

    标签: c# tuples selecteditemchanged


    【解决方案1】:

    为什么不将 e.NewValue 转换为您的元组?

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-16
        • 2011-04-10
        • 1970-01-01
        • 1970-01-01
        • 2018-09-11
        • 2018-01-25
        • 2015-08-10
        • 1970-01-01
        相关资源
        最近更新 更多