【问题标题】:ValidationRules within control template控件模板中的 ValidationRules
【发布时间】:2011-09-05 09:50:30
【问题描述】:

我有继承自文本框的控件

public class MyTextBox : TextBox

这有一种风格

<Style TargetType="{x:Type Controls:MyTextBox}">

其中一个二传手是

<Setter Property="Template">

我希望能够将Binding.ValidationRules 设置为模板中的某些内容,从而影响此类文本框的所有实例。 因此,我可以为时间、日期、数字、邮政/邮政编码或任何我想要的内容制作文本框,

我不想在每次创建文本框时都设置验证规则。我只想说我想要一个NumericTextBox 并让它以模板中设置的任何方式进行验证。

这可能吗?

到目前为止,我所看到的只是在控件的每个实例上设置的 ValidationRules,例如

<TextBox x:Name="txtEMail" Template={StaticResource TextBoxErrorTemplate}>
<TextBox.Text>
    <Binding Path="EMail" UpdateSourceTrigger="PropertyChanged" >
        <Binding.ValidationRules>
            <local:RegexValidationRule Pattern="{StaticResource emailRegex}"/>
        </Binding.ValidationRules>
    </Binding>
</TextBox.Text>

(来自http://www.wpftutorial.net/DataValidation.html

【问题讨论】:

    标签: wpf validation validationrules


    【解决方案1】:

    如您所见,验证规则与绑定一起设置。我遇到了同样的问题,对我来说可行的解决方案是做这样的事情:

        public MyTextBox()
        {            
            this.Loaded += new RoutedEventHandler(MyTextBox_Loaded);
        }
    
        void MyTextBox_Loaded(object sender, RoutedEventArgs e)
        {
            var binding = BindingOperations.GetBinding(this, TextBox.ValueProperty);
            binding.ValidationRules.Add(new MyValidationRule());
        }
    

    这里的问题是确保在我们添加验证规则之前设置绑定,因此使用加载,但我不确定这是否适用于所有场景。

    【讨论】:

    • 嗯。好的。那么这如何与 mvvm 相适应。我们应该把这个绑定和验证连接放在后面的代码中吗?在 xaml 上进行每次绑定并以我想象的方式忘记模板是否同样容易/困难?
    • 这种方法与架构无关,用于一般验证,否则我看不到创建从文本框继承的新类的意义。在您的示例中,您需要检查有效的电子邮件。如果您需要特定于应用程序的数据验证,则应始终使用 IDataErrorInfo。
    • 是的,我认为用户控件可以在后面的代码中包含代码。它是一个用户控件,它执行特定的工作并可以确保其数据有效。
    • 就是这样。无论如何,在任何控件中使用代码隐藏并不意味着破坏 MVVM,只要它仅用于管理 UI。
    【解决方案2】:

    我不确定是否可以完全按照您的意愿行事。您可能可以在属性设置器中使用很多技巧(我不会依赖这个,因为它会涉及修改绑定,根据定义,这些绑定是动态的),或者使用代码隐藏/自定义控件。

    相反,我建议您将验证推送到您的 ViewModel,可能使用IDataErrorInfo。那里有很多文章。这是我刚刚在搜索“MVVM 验证”时发现的第一个:

    MVVM - Validation

    这样做将允许您使用标准的 OO 组合技术,因此您可以avoid repeating yourself :)

    【讨论】:

    • 我想我会试试这种方法
    猜你喜欢
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 2010-12-20
    • 1970-01-01
    相关资源
    最近更新 更多