【问题标题】:Current binding value当前绑定值
【发布时间】:2011-09-27 19:12:36
【问题描述】:

我正在编写标记扩展。我有这样的 XAML

<TextBlock Text="{ui:Test SomeInfo}" />

和带有构造函数的 TestExtension 采用一个字符串参数。我得到“SomeInfo”字符串,所以一切都找到了。现在我想嵌套扩展并编写类似的东西

<TextBlock Text="{ui:Test {Binding PropName}}" />

它不能按原样工作。我必须添加一个带有 System.Windows.Data.Binding 类型参数的构造函数。

现在我需要知道

  1. 我应该如何从 Binding 对象中检索当前值?
  2. 什么时候应该这样做?我应该以某种方式订阅更改,还是每次都在 ProvideValue 方法中请求该值?

Update1 PropName 应该针对 TextBlock 的 DataContext 进行解析。

Update2刚找到相关问题:How do I resolve the value of a databinding?

【问题讨论】:

    标签: wpf binding markup-extensions


    【解决方案1】:

    这样的绑定不起作用,因为您的 MarkupExtension 没有 DataContext 并且它没有出现在可视化树中,我认为您不应该直接与绑定对象交互。你真的需要这个扩展吗?也许您可以单独使用绑定和converter

    如果不是您可以创建一个具有可绑定属性的专用类(通过从DependencyObject 继承),但这仍然不会给您DataContextElementName 需要名称范围或RelativeSource 需要可视化树,因此在这种情况下进行绑定的唯一方法是使用Source(例如,将其设置为StaticResource)。这并不理想。

    另外请注意,如果您不直接设置绑定,ProvideValue 方法只会被调用一次,这意味着即使您的扩展中有绑定,它也可能不会很有用(除了一些例外,例如当返回复杂的内容,例如使用绑定的ItemsControl,但您在TextBlock.Text 上设置了扩展名,这只是一个字符串),所以我真的怀疑如果值应该动态更改,您是否想要使用这样的 MarkupExtension基于绑定。如前所述:请考虑使用 convertersMultiBindings 来代替各种值。

    【讨论】:

    • 其实我想用Textblock的DataContext。
    • @adontz:正如我所说,您最好使用带有转换器的普通绑定,让您自己的 MarkupExtension 中的绑定工作很痛苦。
    • 我接受这种痛苦,因为它为标记用户提供了更一致的语法,这对我来说很重要。
    • @adontz: MarkupExtension do 到底是做什么的,语法应该如何更一致,如果你要保持你的标记扩展,你将不得不使用元素语法,例如:&lt;TextBlock.Text&gt;&lt;ui:Test&gt;&lt;!-- Set properties here --&gt;&lt;/ui:Test&gt;&lt;/TextBlock.Text&gt;,它会搞砸并到达 DataContext,您可能需要在资源中定义部分,这几乎肯定不值得。
    • @adontz:从绑定中,您可以使用ProvideValue 获得BindingExpression,但据我所知,这就是它停止的地方。除此之外的所有内容都是 WPF 绑定引擎的内部内容,您无法自己完全解决绑定问题。正如我解释的那样,MarkupExtensions 缺乏绑定自身所需的一切,它们不是可绑定的对象。
    猜你喜欢
    • 2019-03-20
    • 1970-01-01
    • 2011-02-22
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多