1

バインディングで DataContext のメソッドを使用することは可能ですか?

たとえば、署名public bool ProjectIsActive(int number)[注: 静的ではない] は、バインディングで宣言できますか?

編集: ywm と Sheridan の提案に従って、_this という名前でウィンドウにリソースを追加しようとしました。
に署名を変更しましたpublic bool ProjectIsActive(object number)

<Window.Resources>
<ObjectDataProvider x:Key="ProjectIsActive"
                    ObjectInstance="_this.DataContext"
                    MethodName="ProjectIsActive">
    <ObjectDataProvider.MethodParameters>
        <sys:Object></sys:Object>
    </ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>

次に、トリガーのバインディングは次のように設定されます。

<Binding  Source="{StaticResource ProjectIsActive}" Path="MethodParameters[0]" BindsDirectlyToSource="true" />

次のエラーが表示されます: System.Windows.Data Error: 35 : ObjectDataProvider: Failure attempts to invoke method on type; Method='ProjectIsActive'; タイプ='文字列'; Error='パラメーター シグネチャが一致するメソッドが見つかりませんでした。' MissingMethodException:'System.MissingMethodException: メソッド 'System.String.ProjectIsActive' が見つかりません。System.RuntimeType.InvokeMember (文字列名、BindingFlags bindingFlags、バインダー バインダー、オブジェクト ターゲット、Object[] providedArgs、ParameterModifier[] 修飾子、CultureInfo カルチャ、String[] namedParams) で System.Windows.Data.ObjectDataProvider.InvokeMethodOnInstance (Exception & e )'

ObjectDataProvider.MethodParameters のメソッド シグネチャは、戻り値と入力パラメーターを区別しません。続行する方法がわかりません。

注: この目的は、MultiValueConverter を使用して Convert メソッドなどでキャストすることによっても達成できます。プロパティへのバインドは非常に簡単で、[私の場合] メソッドへのバインドは非常に難しいため、興味がありました。メソッドの呼び出しを回避するためのより良い方法は他にもあります。

4

3 に答える 3

1

@ywm の回答に加えて、次の方法でメソッドの入力パラメーターを指定することもできます。

xmlns:System="clr-namespace:System;assembly=mscorlib"

...

<Window.Resources>
    <ObjectDataProvider x:Key="ProjectIsActiveMethod" 
        ObjectType="{x:Type System:Boolean}" IsAsynchronous="True" 
        MethodName="ProjectIsActive">
        <ObjectDataProvider.MethodParameters>
            <System:Int32>10</System:Int32>
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</Window.Resources>
于 2013-11-12T09:15:07.813 に答える