WPF解析绑定表达式

时间:2013-06-18 07:37:40

标签: c# .net wpf binding

有没有办法将包含绑定表达式的字符串转换为Binding对象?

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

或:

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

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

1 个答案:

答案 0 :(得分:4)

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

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

作为一种解决方法,您可以伪造一个控件放在哪里绑定:

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="..."中包含TextBlock,否则它将不知道如何处理前缀。

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