3

有什么方法可以将包含绑定表达式的字符串转换为 Binding 对象?

一个简单的例子是"{Binding Path}"

或者:

"{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=views:IPage}, Path=TensileTestChange}"

实际的绑定表达式存储在 XML 中,它是 XAML 文档的高级表示。

4

1 回答 1

4

你要问的是解析一个MarkupExtension. 我无法直接找到 WPF 的实现(它包含在XamlReader.Parse调用链中的某处)。

经过一番谷歌搜索,似乎没有现成的解决方案可以做到这一点。然而,如果你有一些编写解析器的经验,你可以自己动手。MSDN上给出了解析 MarkupExtension 的规范。

作为一种解决方法,您可以伪造一个将绑定放在上面的控件:

string myBindingExpression = "{Binding MyProperty}";

var test = "<TextBlock xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" Text=\"" 
    + myBindingExpression + "\" />";
var result = XamlReader.Parse(test) as TextBlock;
var bindingExpression = result.GetBindingExpression(TextBlock.TextProperty);

Binding binding = bindingExpression.ParentBinding

这将创建一个 TextBlock,并将绑定作为 Text 属性。它将根据绑定表达式为您提供具有属性设置的绑定对象。

然后,您可以在任何地方应用绑定。

但是请记住,对于带有 xmlns 前缀的更复杂的示例,您需要xmlns:views="..."在 fake中包含TextBlock,否则它将不知道如何处理前缀。

例子:<TextBlock xmlns:views="..." xmlns="..." Text="{Binding MyProperty}" />

于 2013-06-18T08:01:37.433 回答