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>

那么Trigger的Binding设置为:

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

它给出了错误: System.Windows.Data 错误:35:ObjectDataProvider:尝试调用类型方法失败;方法='ProjectIsActive'; 类型='字符串'; 错误='未找到具有匹配参数签名的方法。' MissingMethodException:'System.MissingMethodException:找不到方法'System.String.ProjectIsActive'。在 System.RuntimeType.InvokeMember(字符串名称、BindingFlags bindingFlags、Binder binder、Object 目标、Object[] providedArgs、ParameterModifier[] 修饰符、CultureInfo 文化、String[] namedParams)在 System.Windows.Data.ObjectDataProvider.InvokeMethodOnInstance(Exception & e )'

ObjectDataProvider.MethodParameters 的方法签名没有区分输入参数的返回值,我不知道如何进行。

注意:这个目标也可以通过使用 MultiValueConverter 并在 Convert 方法中进行强制转换等来实现。我只是好奇,因为绑定到属性非常容易,而绑定到方法 [在我的例子中] 非常困难。还有更好的方法来避免调用方法。

4

3 回答 3

3

您可以使用ObjectDataProvider访问从方法返回的数据。

<Window.Resources>
  <ObjectDataProvider x:Key="colors"
  ObjectType="{x:Type local:ColorHelper}"
  MethodName="GetColorNames"/>
</Window.Resources>
于 2013-11-12T08:59:30.637 回答
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 回答
0

除非您编写自己的 ObjectDataProvider 可以竞标,否则似乎没有办法做到这一点。

这是那篇文章的结果,它解释了如何编写 FreezableProxy 来使用 OBjectDataProvider 完成它。

于 2017-02-06T11:53:50.257 回答