0

バインディング式をプログラムで解決する方法はありますか?公開したくない複雑な内部動作がたくさんあるテンプレート化されたコントロールがあります。リストを取得し、完全なアイテムビューのテンプレートと、個々のアイテムテンプレートを変更するための詳細を公開します。コントロールにバインディングパスとして3つのプロパティを設定したいので、次のようにテンプレートを公開できます。

<src:MyControl x:Name="MyControl" 
               FullViewTemplate="{StaticResource FullViewTemplate}"
               TopValueBinding="Items[2]"
               BottomValueBinding="Items[6]"
               CategoryBinding="Items[5]"/>

内部では、データコンテキスト全体を取得して値コンバーターに提供します。これにより、構成可能なバインディングパスが解決されます。このようなもの:

PropertyPath path = new PropertyPath("Items[0]");
var value = Convert.ToDecimal(path.Resolve(dataSource));

現在、プロパティ名とリフレクションを使用して値を抽出していますが、これには複雑なデータ型を処理する柔軟性がなく、フィールド値を取得するために解析とリフレクションロジックの大規模なブロックを作成する必要はありません。

編集:あるいは、このようなことができるのは素晴らしいことです:

{Binding Path={TemplateBinding BottomValueMember}, Converter={StaticResource ScaleValueConverter}}

しかし、これはうまくいかないようです。何かご意見は?

4

1 に答える 1

0

だから-多くの掘り下げた後、私は次のコードでこれを解決しました:

    public class BindingEvaluator : DependencyObject
{
    private static readonly DependencyProperty TargetProperty =
        DependencyProperty.Register(
            "Target",
            typeof(object),
            typeof(BindingEvaluator),
            new PropertyMetadata(null));

    private object Target
    {
        get { return GetValue(TargetProperty); }
        set { SetValue(TargetProperty, value); }
    }

    private static BindingEvaluator _instance = new BindingEvaluator();
    private static BindingEvaluator Instance
    {
        get { return _instance; }
    }

    public static object Eval(Object instance, string path)
    {
        Binding binding = new Binding(path) { Source = instance };

        BindingOperations.SetBinding(Instance, TargetProperty, binding);

        return Instance.Target;
    }
}

この投稿からの回答の功績:PropertyPathクラスを使用してオブジェクトのプロパティ値を取得する方法はありますか?

これで、データ項目全体を渡して、コンバーターに処理させるだけです。

于 2012-08-01T09:52:31.923 に答える