我正在为 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) 我有控制权继承自文本框
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)
我遇到了多个字段之间的验证问题.例如 - 我得到了一个名为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当前的验证状态.
介绍
我创建了一个DecimalTextBox UserControl
,它包含了我需要完成的一些十进制验证,因此我不需要每次都重新创建验证,而只需使用它UserControl
.DependencyProperties
根据Josh Smith的这篇文章,这个验证具有需要绑定的属性,因此我创建了所以我可以绑定它们.
问题
控件的验证表现得很奇怪.当我输入错误的值时TextBox
,它会显示为错误.但是,当我尝试在代码中更改值时,文本框中显示的值保持不变.
以下是我执行导致此错误的步骤(在此示例中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) 我正在寻找一个解决方案和/或为什么在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触发时切换整个绑定.不寒而栗
任何想法都非常感谢!
我在输入字段中有几个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中的保存.
我知道如何使用嵌套元素(例如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 值。我怎样才能使它成为一个?
为了验证已注册用户的电子邮件更新,我有下一个功能来排除当前用户的“唯一”规则:
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 个参数的语法:
有人可以澄清 except 和 idColumn 指的是什么?
那些痴迷于重复问题的人请注意:我不是在问如何对更新进行规则排除,因为它似乎工作得很好,我已经阅读了这些问题和答案。我正在制作辅助函数,我需要确切地知道这两个参数的含义。
根据我的经验,.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,还是我们需要使用规则引擎或者什么?现实世界中的人们如何处理这种情况?:-)
这段代码有效,但我需要它基本上在 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) validationrules ×10
wpf ×7
c# ×4
validation ×4
xaml ×3
data-binding ×2
.net ×1
ajax ×1
datatemplate ×1
dynamic ×1
javascript ×1
jquery ×1
laravel ×1
laravel-5 ×1
mvvm ×1