代码之家  ›  专栏  ›  技术社区  ›  devios1

“System.Windows.Data.MultiBinding”不是属性“Text”的有效值

  •  1
  • devios1  · 技术社区  · 15 年前

    我在写一个习惯 MarkupExtension 这允许我使用自己的机制定义绑定,但是当我尝试返回 MultiBinding 从我 标记扩展 我得到上面的例外。

    我有:

    <TextBlock Text="{my:CustomMarkup ...}" />
    

    CustomMarkup 返回A 多重装订 但是显然 Text 不喜欢被设置为 多重装订 . 当我说:

    <TextBlock>
        <TextBlock.Text>
            <MultiBinding ... />
        </TextBlock.Text>
    </TextBlock>
    

    但这跟我做的不一样?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Thomas Levesque    15 年前

    不要退回 MultiBinding 本身。相反,返回 MultiBinding.ProvideValue .

    顺便问一句,您在标记扩展中究竟在做什么?也许你可以继承 多重装订 ,如果不需要重写 ProvideValue (密封)。只要设置适当的 Converter 和其他属性

        2
  •  0
  •   devios1    15 年前

    做了一些调查,结果发现我应该在MarkupExtension的ProvideValue方法中设置绑定,然后返回绑定的当前值。有点违反直觉,但到目前为止似乎是有效的!

    以下是我最后得出的结论:

    public override object ProvideValue( IServiceProvider serviceProvider ) {
        IProvideValueTarget valueProvider = (IProvideValueTarget)serviceProvider.GetService( typeof( IProvideValueTarget ) );
        // only need to do this if they're needed in your logic:
        object @target = valueProvider.TargetObject;
        object @property = valueProvider.TargetProperty;
    
        MultiBinding result = new MultiBinding();
    
        // set up binding as per custom logic...
    
        return result.ProvideValue( serviceProvider );
    }
    

    加上一点逻辑,轻轻地擦上灰尘,处理错误,然后发球。

    更新: 结果是multibinding.providevalue()根据中的目标和属性信息挂接绑定本身。 serviceProvider . 那就干净多了。