1

これが私の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<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;

コンパイルされません...:(

4

2 に答える 2

1

e.NewValueをタプルにキャストしてみませんか?

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

演算子を使用するasと、キャストが失敗した場合にタプルがnullになることが確認されます。

于 2011-12-20T13:02:02.043 に答える
0

e.NewValue正しいタイプにキャストするだけです:

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

もちろん、これはキャストが正しく使用されていないという例外を生み出しますが、それは完全に別の問題です。この特定のシナリオで機能するため、そのまま使用するか、このハンドラーを他のアイテムタイプにも使用する場合は抽象化することができます。

于 2011-12-20T12:58:36.180 に答える