6

キーに基づいて文字列を変換するためのマークアップ拡張機能を作成しました。例

<TextBlock Text="{Translate myKey}" />

ここで、キーを提供するためにネストされたバインディングを使用できるようにしたいと考えています。例:

<TextBlock Text="{Translate {Binding KeyFromDataContext}}" />

これを行うと、System.Windows.Data.Binding オブジェクトを取得します。ProviderValue を呼び出して ServiceProvider を渡すことで、BindingExpression を取得できます。

var binding = Key as Binding;
if (binding == null) {
    return null;
}
var bindingExpression = binding.ProvideValue(_serviceProvider) as BindingExpression;
if (bindingExpression == null) {
    return null;
}
var bindingKey = bindingExpression.DataItem;

この bindingExpression を取得できますが、DataItem プロパティが null です。私はこのようにバインディングをテストしました

<TextBlock Text="{Binding KeyFromDataContext}" />

そしてそれはうまくいきます。

何か案は?

4

2 に答える 2

2

バインディングの値を取得することはできません。あなたはこれをやろうとしているわけではありません。WPF はいくつかの凝ったリフレクションを使用してバインディングを解決します。私を信頼してください。自分で試してみたいとは思わないでしょう。

とにかくそれを念頭に置いて、これは私がやったことであり、実際には素晴らしい解決策です:

TranslateConverter翻訳を処理するを作成しました。

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    var key = value as string ?? parameter as string;

    if (key != null)
    {
    // Do translation based on the key

    }
    return null;
}

次に、私TranslateExtensionは単にこれを行います:

var binding = Key as Binding ?? new Binding{Mode = BindingMode.OneWay};
binding.Converter = new TranslateConverter(_targetObject, _targetProperty, Dictionary, Converter);
binding.ConverterParameter = Key is Binding ? null : Key as string;

return binding.ProvideValue(serviceProvider);

このようにして、バインドは WPF によって解決され、値としてコンバーターに渡されますが、単純なテキスト キーはパラメーターとしてコンバーターに渡されます。

_targetObjectServiceProviderから_targetProperty取得されます。

于 2009-06-17T11:24:20.910 に答える