【问题标题】:Binding ValidationRules in one line?在一行中绑定 ValidationRules?
【发布时间】:2010-07-14 03:03:32
【问题描述】:

我已经编写了几个单行绑定,如果可能并且如果它仍然是人类可读的,我想保持这种方式。 有没有办法重写这个

<TextBox.Text>
    <Binding Path="SomePath" NotifyOnValidationError="True" >
        <Binding.ValidationRules>
            <local:ValidationRule1></local:ValidationRule1>
        </Binding.ValidationRules>
    </Binding>
</TextBox.Text>

一行?,比如

<TextBox Text="{Binding Path=SomePath, [ValidationRule1...]}" />

【问题讨论】:

标签: wpf syntax binding


【解决方案1】:

我认为没有单行本,而且标准版本更具可读性。

【讨论】:

    【解决方案2】:

    没有开箱即用的单行,但完全可以利用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>
    

    瞧!现在只需一行代码即可将验证规则应用于绑定。

    当然,拥有一个专门用于单一验证绑定的扩展可能看起来很浪费。然而,通过这个简单的概念验证,很容易扩展自定义绑定标记的想法。例如,您可以将常用的转换器和验证规则组合分组到对象中,将它们定义为静态资源,然后使用自定义绑定定义将它们应用于绑定。

    【讨论】:

      猜你喜欢
      • 2011-06-21
      • 1970-01-01
      • 2014-07-05
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多