标签: validationrules

运行时的 WPF Binding.ValidationRules

我正在为 XAML 中的各种控件编写验证规则。我想在运行时而不是在 XAML 中将validationRules 附加到控件。我正在考虑使用 Converters 。但任何想法/想法将是实现这一目标的更好方法。

示例代码:

 <TextBox Name="txtFirstName" >   <TextBox.Text>  <Binding Path="FirstName" ValidatesOnDataErrors="True" PropertyChanged" >
          <Binding.ValidationRules>
                <Binding Converter="{StaticResource validationConverter}"/>
           </Binding.ValidationRules>             
    </Binding>                                               
Run Code Online (Sandbox Code Playgroud)


public class ValidationConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    {
        Binding b = new Binding();
        b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
        b.ValidatesOnDataErrors = true;
        b.NotifyOnValidationError = true;
        b.ValidationRules.Add(new RangeValidationRule { ErrorMessage = "Error shown from Converter ", MinValue = 10, MaxValue = 50 });
        return b;
    }

    public object ConvertBack(object value, Type …
Run Code Online (Sandbox Code Playgroud)

wpf dynamic validationrules

5
推荐指数
1
解决办法
1841
查看次数

控制模板中的ValidationRules

我有控制权继承自文本框

public class MyTextBox : TextBox
Run Code Online (Sandbox Code Playgroud)

这有一种风格

<Style TargetType="{x:Type Controls:MyTextBox}">
Run Code Online (Sandbox Code Playgroud)

塞特犬之一是

<Setter Property="Template">
Run Code Online (Sandbox Code Playgroud)

我希望能够Binding.ValidationRules在模板中设置内容,从而影响此类文本框的所有实例.因此,我可以制作文本框,例如Times,Dates,Numerics,post/zip code ..或者我想要的任何东西,

我不想每次创建文本框时都设置验证规则.我只想说我想要一个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>
Run Code Online (Sandbox Code Playgroud)

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

validation wpf validationrules

5
推荐指数
1
解决办法
1364
查看次数

在不同级别的多个字段之间进行验证

我遇到了多个字段之间的验证问题.例如 - 我得到了一个名为RangeDateViewModel的ViewModel,它包含名为DateViewModel的类的2个实例,每个实例分别代表一个开始日期和结束日期.

所以我的绑定看起来像这样 -

<TextBox Text="{Binding StartDate.Date, ValidateOnDataError=True}">
<TextBox Text="{Binding EndDate.Date, ValidateOnDataError=True}">
Run Code Online (Sandbox Code Playgroud)

我的RangeDateViewModel类实现了IDataErrorInfo接口.在我的计划中,RangeDateViewModel将通过在IDataErrorInfo ["propertyName"]函数中应用验证逻辑来​​验证开始日期是否在结束日期之前 -

    public string this[string columnName]
    {
         get
         {
            return ValidationError();
         }
     }
Run Code Online (Sandbox Code Playgroud)

问题是永远不会调用它,而是调用驻留在每个DateViewModel类中的IDataErrorInfo属性.

我想这是因为bound属性不在RangeDateViewModel的同一级别,而是在子DateViewModel中.

我认为我的需求是非常基本的,必须有一个简单的解决方案来解决这个问题.我尝试使用ValidationRules而不是IDataErrorInfo,但后来我遇到了问题,让ViewModel知道ValidationRules当前的验证状态.

validation wpf mvvm idataerrorinfo validationrules

5
推荐指数
1
解决办法
1270
查看次数

当值设置回有效值时,ValidationRules不会删除错误

介绍

我创建了一个DecimalTextBox UserControl,它包含了我需要完成的一些十进制验证,因此我不需要每次都重新创建验证,而只需使用它UserControl.DependencyProperties根据Josh Smith的这篇文章,这个验证具有需要绑定的属性,因此我创建了所以我可以绑定它们.


问题

控件的验证表现得很奇怪.当我输入错误的值时TextBox,它会显示为错误.但是,当我尝试在代码中更改值时,文本框中显示的值保持不变.

以下是我执行导致此错误的步骤(在此示例中1是无效值):

  1. 加载表单,默认值为0.
  2. 在文本框中输入1(由于验证结果为错误,文本框变为红色)
  3. 在代码中,我将绑定到文本框的属性设置为0
  4. 表单仍然在红色文本框中显示1

代码示例

我准备了一个演示问题的例子,可以在这里下载.

我会在这里发布一些代码,如果你想要更多让我知道.

ValidationTestControl的XAML

<UserControl x:Class="WPFTestProject.ValidationTestControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:v="clr-namespace:WPFTestProject"
    x:Name="ValidationTest"
    Height="50" Width="525">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition></RowDefinition>          

    </Grid.RowDefinitions>
    <StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
        <TextBlock Text="Type 'Banana' here: "></TextBlock>
        <TextBox MinWidth="100">
            <TextBox.Text>
                <Binding ElementName="ValidationTest"  Path="Text" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay" ValidatesOnDataErrors="True" ValidatesOnExceptions="True">
                    <Binding.ValidationRules>
                        <v:NotBananaValidationRule>
                            <v:NotBananaValidationRule.NotWhatBinding>
                                <v:NotBananaBinding x:Name="NotBananaValidationBinding"></v:NotBananaBinding>
                            </v:NotBananaValidationRule.NotWhatBinding>
                        </v:NotBananaValidationRule>
                    </Binding.ValidationRules> …
Run Code Online (Sandbox Code Playgroud)

c# wpf xaml user-controls validationrules

5
推荐指数
1
解决办法
998
查看次数

无法共享ValidationRules时,在DataTemplates中重用的绑定实例

我正在寻找一个解决方案和/或为什么在DataTemplate中共享Binding实例的合理性.这最终归结为这样一个事实:在DataTemplate中,似乎没有办法在DependencyProperty上为每个生成的控件强制执行Binding的新实例.在所有情况下,这可能是一个公平和良好的假设,除非有ValidationRules表示特定于该控件实例的某些内容.

为了详细说明(我可以提供代码,但我不认为这是必要的),我在IsEnabled上使用DependencyPropertyDescriptor来更新属于TextBox.Text Binding,DatePicker.Text Binding或ComboBox.SelectedValue Binding的一个或多个ValidationRules.等等.当未启用控件时,验证将是不同的或不期望的.

因此,ValidationRule的IsEnabled状态特定于单个控件,因为ValidationRule集合是Binding的一部分,Binding实例正在共享 - 每个最终共享该绑定的控件将更新/覆盖之前的IsEnabled值由先前生成的控件的IsEnabled值应用.

IsEnabled只是ValidationRule中的至少两个属性之一(另一个自定义IsRequired DependencyProperty),它表示应用Binding的控件的状态.在DataTemplate之外工作时(IE:未共享Binding实例),这非常有效,并根据控件的状态忽略/更改验证逻辑.我并没有关闭替代方案,但确实认为这是一个非常灵活和动态的选项,它允许Binding实例ValidationRule和规则的控制更改状态毫不费力地发展.这也让我避免了其他明显但更丑陋的选项,比如创建几个Bindings,每个Bindings代表ValidationRule控件属性的一个组合,并在DependencyPropertyDescriptor触发时切换整个绑定.不寒而栗

任何想法都非常感谢!

data-binding wpf datatemplate validationrules

5
推荐指数
1
解决办法
528
查看次数

当ValidationRule失败时,属性绑定不会更新

我在输入字段中有几个TextBox,在我的视图中有一个"Save"按钮.其中两个TextBox是保存所必需的字段,我在xaml中设置了一个自定义ValidationRule,用于一些视觉反馈(红色边框和工具提示),如下所示:

<TextBox ToolTip="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}">
    <TextBox.Text>
        <Binding Path="ScriptFileMap" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <v:MinimumStringLengthRule MinimumLength="1" ErrorMessage="Map is required for saving." />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>
Run Code Online (Sandbox Code Playgroud)

"保存"按钮链接到一个调用SaveScript()函数的DelegateCommand.如果两个必填字段的属性为空,则该函数不允许用户保存:

public void SaveScript()
{
    if (this.ScriptFileName.Length > 0 && this.ScriptFileMap.Length > 0)
    {
        // save function logic
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,该功能仍允许保存文件.仔细观察,我发现当ValidationRule失败时,这两个字段(ScriptFileName和ScriptFileMap)的值没有被更新,并且它超过了最后的已知值.

这是ValidationRule的预期行为还是我在某处丢失了某些东西或出现故障?如果是前者,有没有办法覆盖这种行为?如果空字符串永远不会传递给bound属性,我无法阻止ViewModel中的保存.

c# wpf xaml validationrules

5
推荐指数
2
解决办法
2272
查看次数

如何将 ValidationRules 添加到 WPF 内联绑定?

我知道如何使用嵌套元素(例如here)定义ValidationRules,但是如何内联执行它?IE

<TextBox Text="{Binding Amount, ValidationRules=???, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}" >
Run Code Online (Sandbox Code Playgroud)

我尝试了ValidationRules={StaticResource CashAmountRule}CashAmountRule 指向我的自定义验证规则类的位置,但编译器抱怨它不是 Collection 值。我怎样才能使它成为一个?

c# data-binding wpf xaml validationrules

5
推荐指数
1
解决办法
1559
查看次数

“unique:table,column,except,idColumn”中的“except”和“idColumn”指的是什么?来自 Laravel 文档

为了验证已注册用户的电子邮件更新,我有下一个功能来排除当前用户的“唯一”规则:

public function updateRules() {
    return [
        'name'  => 'required',
        'email' => 'required|unique:users,email,'.$this->id,
    ];
}
Run Code Online (Sandbox Code Playgroud)

在 Laravel 文档https://laravel.com/docs/5.7/validation#rule-unique我找到了unique:table,column,except,idColumn带有 4 个参数的语法:

  • table:指表名“users”
  • column:指的是列名“email”
  • 除了:我把它作为我想从“唯一”验证中排除的模型实例的 id
  • idColumn:我不知道这个

有人可以澄清 except 和 idColumn 指的是什么?

那些痴迷于重复问题的人请注意:我不是在问如何对更新进行规则排除,因为它似乎工作得很好,我已经阅读了这些问题和答案。我正在制作辅助函数,我需要确切地知道这两个参数的含义。

validation validationrules laravel laravel-5

5
推荐指数
1
解决办法
2151
查看次数

.NET中的验证框架,可以在字段之间进行编辑

根据我的经验,.NET中的许多验证框架允许您一次验证一个字段,例如确保字段是邮政编码或电子邮件地址.我通常将这些内部编辑称为.

在我的项目中,我们经常需要进行场间编辑.例如,如果您有这样的类:

public class Range
{
    public int Min { get; set; }
    public int Max { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

您可能希望确保Max大于Min.您可能还想对外部对象进行一些验证.例如,鉴于你有一个这样的类:

public class Person
{
    public string PostalCode { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

无论出于何种原因,您希望确保邮政编码存在于数据库或提供给您的文件中.我有更复杂的例子,比如用户提供数据字典,你想根据该数据字典验证你的对象.

我的问题是:我们可以使用任何现有的验证框架(TNValidate,NHibernate Validator)用于.NET,还是我们需要使用规则引擎或者什么?现实世界中的人们如何处理这种情况?:-)

.net c# validation validationrules

4
推荐指数
1
解决办法
1948
查看次数

带有 If/Else 语句的 Jquery 验证规则

这段代码有效,但我需要它基本上在 id 字段上执行 If Else 。如果 id 长度 >0,则不检查名称,根据需要检查邮政编码。如果 id 不 > 0,则根据需要检查名称、邮政编码等。欢迎您提出建议。谢谢,

 runAllForms();
 $(function () {
 $("#artist_create_event").validate({

        // Rules for form validation
        rules : {
            artist_create_event_name : {
                required : true
            },
            artist_create_event_desc : {
                required : true
            },
            id :  {
                required : true
             },
            name :  {
                required : true
             },
            zipcode :  {
                required : true
             },
            venue_name :  {
                required : true
             },
            city :  {
                required : true
             },
            state :  {
                required : …
Run Code Online (Sandbox Code Playgroud)

javascript ajax jquery jquery-validate validationrules

4
推荐指数
2
解决办法
3万
查看次数