没有开箱即用的单行,但完全可以利用markup extensions 自己制作一个。更具体地说,为项目中的典型场景创建自定义绑定方法。
需要注意的一个有用的事情是Binding 类本身就是一个标记扩展,因此提供了ProvideValue 的实现。这意味着自定义绑定标记扩展可以只创建或获取绑定,根据需要填写其值并通过新修改的绑定提供值。
例如,如果您通常使用单个验证规则并希望将其保存在单行中,则可能需要创建这样的扩展:
using System;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Markup;
namespace MyProject.Markup
{
public class SingleValidationBindingExtension : MarkupExtension
{
private Binding _binding;
public SingleValidationBindingExtension(Binding binding, ValidationRule validationRule)
{
_binding = binding;
_binding.ValidationRules.Add(validationRule);
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return _binding.ProvideValue(serviceProvider);
}
}
}
然后,在您的 XAML 中某处:
<UserControl xmlns:ext="clr-namespace:MyProject.Markup;assembly=MyProject"
...>
<UserControl.Resources>
<local:ValidationRule1 x:Key="ValidationRule1"/>
</UserControl.Resources>
<!-- Note that you can customize other binding properties within the inner {Binding ...} markup -->
<TextBox Text="{ext:SingleValidationBinding {Binding SomePath}, {StaticResource ValidationRule1}}" />
</UserControl>
瞧!现在只需一行代码即可将验证规则应用于绑定。
当然,拥有一个专门用于单一验证绑定的扩展可能看起来很浪费。然而,通过这个简单的概念验证,很容易扩展自定义绑定标记的想法。例如,您可以将常用的转换器和验证规则组合分组到对象中,将它们定义为静态资源,然后使用自定义绑定定义将它们应用于绑定。