【问题标题】:Binding to a method in DataContext绑定到 DataContext 中的方法
【发布时间】:2013-11-24 07:38:45
【问题描述】:

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

例如签名public bool ProjectIsActive(int number) [注意:不是静态的],可以在绑定中声明吗?

编辑:根据 ywm 和 Sheridan 的建议,我尝试将资源添加到我的 Window,名称为 _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 方法中进行强制转换等来实现。我只是好奇,因为绑定到一个属性是如此简单,而绑定到一个方法 [在我的例子中] 如此困难。还有更好的方法来避免调用方法。

【问题讨论】:

    标签: wpf binding


    【解决方案1】:

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

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

    【讨论】:

    • 好吧,但关键是在我的情况下,我希望 local:ColorHelper 成为我的 DataContext 的实例。我相信 ObjectDataProvider 使用默认 ctor 并创建一个新类。我会试试ObjectInstance="DataContext"
    • @Gerard 你是如何使用 ObjectInstance 的?
    • 这是正确的@Gerald。它每次都使用一个新实例,并采用默认 ctor。
    【解决方案2】:

    除了@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>
    

    【讨论】:

    • 也没有解决原发帖人关于是否可以使用 DC 对象让 ObjectDataProvider 进行调用的问题。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-03-24
      • 2011-11-27
      • 2013-11-16
      • 2013-02-02
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 2015-01-21
      相关资源
      最近更新 更多