jno*_*ovo 6 wpf xaml markup-extensions string-interpolation c#-6.0
我正在考虑在 XAML 中使用 C# 6 字符串插值的方法,例如在一些简单的场景中使用它们而不是值转换器,例如在绑定到数字时用空字符串替换零。
从它的设计讨论:
内插字符串是一种构造字符串(或 IFormattable)类型值的方法,方法是将字符串的文本与将填充字符串中的“漏洞”的表达式一起写入。编译器根据内插字符串构造格式字符串和填充值序列。
但是,正如我怀疑的那样,它们似乎无法从 XAML 中使用,因为它使用不同的编译器来生成 BAML,而且我在生成的.g.i.cs文件中找不到字符串的踪迹。
这听起来很像 .Net 3.5 中引入的 StringFormat 属性。正如您引用的那样,“将字符串的文本与将填充字符串中的‘洞’的表达式一起编写”,这可以在 XAML 绑定中执行,如下所示:
<TextBlock Text="{Binding Amount, StringFormat=Total: {0:C}}" />
Run Code Online (Sandbox Code Playgroud)
由于您可以使用任何自定义字符串格式,因此这里有很多功能。或者你在问别的?
由于绑定在 WPF 中的工作方式,支持这一点很困难。C# 代码中的字符串插值可以直接编译为string.Format调用,基本上只是提供方便的语法糖。不过,为了使此功能与 Binding 一起工作,有必要在运行时做一些工作。
我已经整理了一个可以做到这一点的简单类,尽管它有一些限制。特别是,它不支持传递所有绑定参数,并且在 XAML 中键入很尴尬,因为您必须转义大括号(也许值得使用不同的字符?)它应该处理多路径绑定和任意复杂的格式不过,只要正确转义字符串以便在 XAML 中使用即可。
关于您问题中的一个特定点,这不允许您像在插值字符串中那样嵌入任意表达式。如果您想这样做,您必须变得更花哨,并根据绑定值执行诸如动态代码编译之类的操作。您很可能需要发出一个接受参数值的函数调用,然后将其作为值转换器的委托调用并让它执行嵌入的表达式。应该是可以的,但是实施起来可能并不容易。
用法如下:
<TextBlock Text="{local:InterpolatedBinding '\{TestString\}: \{TestDouble:0.0\}'}"/>
Run Code Online (Sandbox Code Playgroud)
这是完成这项工作的标记扩展:
<TextBlock Text="{local:InterpolatedBinding '\{TestString\}: \{TestDouble:0.0\}'}"/>
Run Code Online (Sandbox Code Playgroud)
我做了非常有限的测试,因此我建议在生产中使用它之前进行更彻底的测试和强化。不过,希望这对某人来说是一个很好的起点,可以做出一些有用的东西。
| 归档时间: |
|
| 查看次数: |
4129 次 |
| 最近记录: |