c# - WPF 解析绑定(bind)表达式

标签 c# .net wpf binding

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

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

或:

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

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

最佳答案

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

谷歌搜索后,似乎没有现成的解决方案可用于执行此操作。但是,如果您有一些编写解析器的经验,您可以自己编写。解析 MarkupExtension 的规范在 MSDN 上给出。 .

作为解决方法,您可以在放置绑定(bind)的位置伪造一个控件:

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

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

然后您可以在任何地方应用绑定(bind)。

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

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

关于c# - WPF 解析绑定(bind)表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17163138/

相关文章:

c# - await client.GetStringAsync 无一异常(exception)退出

c# - 如何在数据表上进行此查询?

c# - 将 "if"语句条件移动到局部变量会使 C# 编译器不满意

c# - PetaPoco 未返回预期数据

c# - 当您声明一个没有实例的对象时,.Net 会做什么?

c# - 从代码隐藏添加资源并在 XAML 中使用

c# - Prism 事件聚合器缓冲

WPF:如何在不同时禁用箭头键导航的情况下禁用选项卡导航?

c# - 使用网络摄像头捕获视频并使用 C# 保存为 avi

c# - WPF 全局化(也许不是)