WPF解析绑定表达式

本文关键字:表达式 绑定 WPF | 更新日期: 2023-09-27 18:18:45

是否有任何方法将包含绑定表达式的字符串转换为绑定对象?

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

或:

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

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

WPF解析绑定表达式

您要求的是解析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

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

你可以在任何地方应用绑定。

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

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