绑定到DataContext中的方法

时间:2013-11-12 08:34:41

标签: wpf binding

是否可以在绑定中使用DataContext的方法?

E.g。签名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错误:35:ObjectDataProvider:尝试在类型上调用方法失败;方法= 'ProjectIsActive';类型=“字符串”; Error ='找不到匹配参数签名的方法。 MissingMethodException:'System.MissingMethodException:Method'System.String.ProjectIsActive'未找到。    at System.RuntimeType.InvokeMember(String name,BindingFlags bindingFlags,Binder binder,Object target,Object [] providedArgs,ParameterModifier [] modifiers,CultureInfo culture,String [] namedParams)    在System.Windows.Data.ObjectDataProvider.InvokeMethodOnInstance(例外&amp; e)'

ObjectDataProvider.MethodParameters的方法签名并没有从输入参数中返回值,我不知道如何继续。

注意:目标也可以通过使用MultiValueConverter和转换方法等来实现。我只是好奇,因为绑定到属性是如此简单,并且绑定到[在我的情况下]方法是如此困难。还有更好的方法可以避免调用方法。

3 个答案:

答案 0 :(得分:3)

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

<Window.Resources>
  <ObjectDataProvider x:Key="colors"
  ObjectType="{x:Type local:ColorHelper}"
  MethodName="GetColorNames"/>
</Window.Resources>

答案 1 :(得分: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>

答案 2 :(得分:0)

似乎没有办法做到这一点,除非你编写自己的ObjectDataProvider可以进行招标。

这是that post的结果,它解释了如何使用OBjectDataProvider编写FreezableProxy来完成它。