- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在处理一个处理特定数据类型范围验证的 .NET 4.0 项目。例如,一个 32 位的 int 应该只在 Int32.MinValue
之间。和 Int32.MaxValue
或应用程序定义的任何其他值。我希望能够在自定义验证器上指定数据类型和范围,以便可以通过绑定(bind)直接从 xaml 调用它们:<CheckIfValueRangeValidator>
这就是我的想法,我不确定它是否有效,或者是否可以通过 xaml 完成。
class CheckIfValueInRangeValidator<T> : ValidationRule
{
public T Max { get; set; }
public T Min { get; set; }
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
// Implementation...
}
}
最佳答案
糟糕,实际上你不能使用 x:TypeArguments 因为它会引发 x:TypeArguments is not allowed in object elements for XAML version than 2009, it's valid only on loose XAML files or the root元素(在我的例子中是窗口)...
http://msdn.microsoft.com/en-us/library/ms750476.aspx
但作为解决方法,您可以使用以下模式:
<TextBox x:Name="textBox1">
<Binding Path="MyValue"
Source="{StaticResource MyObject}"
UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<wpfApplication6:MyValidationRule ObjectType="{x:Type system:Int32}" />
</Binding.ValidationRules>
</Binding>
</TextBox>
代码隐藏:
public class MyObject
{
public object MyValue { get; set; }
}
public class MyValidationRule : ValidationRule
{
public Type ObjectType { get; set; }
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
throw new NotImplementedException();
}
}
也看看这个: Using a Generic IValueConverter from XAML
@Blam 评论值得考虑,要检查的范围通常适用于整数或 double ,对于其他类型我会说你可以只添加一个返回该对象有效性的 bool 值并在对象本身。
对于数字,您有 RangeAttribute但它实际上并不是 WPF 验证基础结构的一部分。
您还有另一个验证选项:INotifyDataErrorInfo在这种情况下,验证发生在对象内部。
我在这里写了一个冗长的答案:https://softwareengineering.stackexchange.com/questions/203590/is-there-an-effective-way-for-creating-complex-forms您可能会在上面找到有用的东西。
根据我的经验,我认为通用验证规则可能并不明智。
您应该将您的问题编辑得不那么笼统 ;-) 而是更具体一些,您会从这里的人那里得到更多帮助。给出您要验证的对象的一两个具体案例。
编辑
您还可以使用 BindingGroup 来验证对象:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void TextBox1_OnTextChanged(object sender, TextChangedEventArgs e)
{
grid.BindingGroup.CommitEdit();
}
}
public class Indices
{
public int ColorIndex { get; set; }
public string ColorPrefix { get; set; }
public int GradientIndex { get; set; }
public string GradientPrefix { get; set; }
}
public class ValidateMe : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
var bindingGroup = value as BindingGroup;
var o = bindingGroup.Items[0] as Indices;
return new ValidationResult(true, null);
}
}
<Window x:Class="WpfApplication6.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wpfApplication6="clr-namespace:WpfApplication6"
Title="MainWindow"
Width="525"
Height="350">
<Window.Resources>
<wpfApplication6:Indices x:Key="Indices"
ColorIndex="1"
ColorPrefix="MyColor"
GradientIndex="1"
GradientPrefix="MyGradient" />
</Window.Resources>
<Grid x:Name="grid" DataContext="{StaticResource Indices}">
<Grid.BindingGroup>
<BindingGroup>
<BindingGroup.ValidationRules>
<wpfApplication6:ValidateMe />
</BindingGroup.ValidationRules>
</BindingGroup>
</Grid.BindingGroup>
<TextBox TextChanged="TextBox1_OnTextChanged">
<Binding Path="ColorIndex" UpdateSourceTrigger="PropertyChanged" />
</TextBox>
</Grid>
</Window>
使用范围属性:
private void test()
{
Indices indices = new Indices();
indices.ColorIndex = 20;
var validationContext = new ValidationContext(indices);
var validationResults = new List<System.ComponentModel.DataAnnotations.ValidationResult>();
var tryValidateObject = Validator.TryValidateObject(indices, validationContext, validationResults,true);
}
public class Indices
{
[Range(1, 10)]
public int ColorIndex { get; set; }
public string ColorPrefix { get; set; }
public int GradientIndex { get; set; }
public string GradientPrefix { get; set; }
}
关于c# - 是否可以创建通用的 ValidationRule 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17557068/
我正在使用一个 PasswordBox,它公开了一个依赖属性,以便我可以绑定(bind)到它。问题是,通过这样使用它,我无法将 Binding.ValidationRules 简写为以下语法: 我
我有从文本框继承的控制权 public class MyTextBox : TextBox 这个有风格 二传手之一是 我希望能够设置 Binding.ValidationRules模板中的某些内容
假设你有一个继承自 ValidationRule 的类: public class MyValidationRule : ValidationRule { public string Vali
我有一个带有此验证的控件 这是验证类: class MyValidationRule : ValidationRule { private string
aurelia-validation 插件的介绍包含一个关于创建自定义 ValidationRules 的部分,方法是扩展 ValidationRule 类并将其传递给 passes 函数。给出的例子
我有一个简单的问题,但我找不到好的解决方案。我有一个绑定(bind)到双属性值的文本框。用户可以在文本框中输入值,但我只想允许 0 到 100 之间的值。如果在文本框仍具有焦点时输入无效值,我想在文本
编辑:在这里找到适合我的解决方案: http://social.msdn.microsoft.com/Forums/en/wpf/thread/c1fd21b2-424b-4536-be8c-335c
我有以下文本框,它们在 View 模型中更改了属性。 当我插入 Binding.ValidationRules 并插入一些错误的值时,它不会触发 propertychanged 事件,我不明白为什么。
我正在为 XAML 中的各种控件编写验证规则。我想在运行时将validationRules 附加到控件,而不是在XAML 中。我正在考虑使用 Converters 。但是任何想法/想法都可以更好地实现
我想在文本框上使用 ValidationRules(以及它的 UI 效果),而无需将任何内容实际绑定(bind)到文本框。 我想将文本框用于一些不绑定(bind)到任何内容但需要在使用 Validat
我已经编写了几个单行绑定(bind),如果可能并且如果它仍然是人类可读的,我想保持这种方式。 有没有办法重写这个
我有 TimePicker和验证规则 ....
我试图理解为什么调用 BindingExpression.ValidateWithoutUpdate()实际上并没有做到它所宣传的那样。 我有一些古怪的验证(我已经从示例代码中删除了无聊的细节;足以说
我正在处理一个处理特定数据类型范围验证的 .NET 4.0 项目。例如,一个 32 位的 int 应该只在 Int32.MinValue 之间。和 Int32.MaxValue或应用程序定义的任何其他
我正在使用带有验证和保存按钮的组合框,如下所示: ..
我是 Aurelia Js 的新手,我需要验证登录表单(必需和 emial)属性。这里我使用了 aurelia-validation 插件。我的代码如下,登录.js import {Router} f
我需要为 Web 应用程序中的用户角色创建一些测试。为了尽量减少描述,其中一项测试涉及检查是否为用户显示菜单条目。 对于此测试,我使用一个名为 UserRoles 的表,如下所示: sUserName
简介 我已经创建了一个 DecimalTextBox UserControl,其中包含我需要完成的一些小数验证,这样我就不需要每次都重新创建验证,并且可以只使用 UserControl 代替。此验证具
谁能告诉我哪种 WPF 验证方法更好。 实现 IDataErrorInfo 创建验证规则 抛出异常 在性能、内存泄漏、代码可维护性和重用方面。 最佳答案 这是一个复杂的请求,老实说,它可能会因偏好而异
我正在尝试使用“ValidationRule”类为必填字段的文本添加验证。我有以下类的实现 using System.Windows.Controls; using System.Globalizat
我是一名优秀的程序员,十分优秀!