WPF解析绑定表达式

3

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

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

或者:

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

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


嗨@Trustme-I'maDoctor,我已经扩展了另一个我需要实现的示例。 - Darkzaelus
我从未真正使用过原始的Binding,所以我个人能做的最好的就是引用Binding类,它包含了你需要的所有属性 - 实际上它是在XAML中使用的相同绑定。我不知道你是否可以以某种预定义的字符串方式传递它,或者你是否需要首先解析该字符串(这将是适得其反的)。 - Patryk Ćwiek
谢谢。不幸的是,我已经在使用原始绑定类了。我想知道是否有现成的解决方案来解析绑定表达式并返回一个绑定对象。 - Darkzaelus
也许XamlReader在这里会有帮助...? - Patryk Ćwiek
看起来这是正确的方式! - Darkzaelus
1个回答

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

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

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

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

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


谢谢Bas,很高兴知道它被称为MarkupExtension,我找不到正确的术语!我也会记住关于xmlns的评论,谢谢! - Darkzaelus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接