代码之家  ›  专栏  ›  技术社区  ›  user347594

WPF绑定ValidationRules在一行中?

  •  3
  • user347594  · 技术社区  · 14 年前

    有没有办法重写这个

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

    排成一行?就像

    <TextBox Text="{Binding Path=SomePath, [ValidationRule1...]}" />
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   user347594    14 年前

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

        2
  •  0
  •   Alice    5 年前

    没有现成的内衬,但完全可以利用它自己做一个 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>
    

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

    诚然,为单个验证绑定专门提供一个扩展似乎是浪费。然而,通过这个简单的概念证明,很容易扩展自定义绑定标记的概念。例如,您可以将转换器和验证规则的常用组合分组到对象中,将它们定义为静态资源,然后使用自定义绑定定义将它们应用于绑定。