2011-09-26 71 views
0

我在写标记扩展。我有这样的XAML当前绑定值

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

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

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

并且它不起作用。我不得不添加构造函数,该构造函数接受System.Windows.Data.Binding类型的一个参数。

现在我需要知道

  1. 我应该如何检索来自绑定对象的电流值?
  2. 我应该什么时候这样做?我应该每次在ProvideValue方法中订阅某种方式的变化还是要求这个值?

UPDATE1 PROPNAME应该反对的TextBlock的DataContext的解决。

UPDATE2刚刚发现相关的问题:How do I resolve the value of a databinding?

回答

4

绑定这样是行不通的,因为你的MarkupExtension没有DataContext,它不会出现在可视化树,我不认为你应该有约束力的互动直接对象。你真的需要这个扩展吗?也许你可以单独使用绑定和converter

如果你不可以创造出具有可绑定属性(由DependencyObject继承)的专用类,然而,这仍然不能给你所需要的ElementName一个DataContext或名称范围或者需要RelativeSource可视树,所以在这种情况下进行绑定工作的唯一方法是使用Source(例如将其设置为StaticResource)。这并不理想。

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

+0

其实,我想使用Textblock的DataContext。 – adontz

+0

@adontz:正如我所说,你可能最好使用一个普通的绑定与转换器,让自己的MarkupExtension内的绑定工作是一个痛苦。 –

+0

我接受这种痛苦,因为它为标记用户提供了对我来说更重要的更一致的语法。 – adontz