gpt4 book ai didi

wpf - IDataErrorInfo 接口(interface)如何工作?

转载 作者:行者123 更新时间:2023-12-04 07:45:31 25 4
gpt4 key购买 nike

我目前正在研究我的 WPF 应用程序的验证,并看到提到 IDataErrorInfo .然而,关于如何使用它的指南很少,更糟糕的是,没有人解释它是如何工作的。
在 MSND.com 网站上给出:
MSDN

public class Person : IDataErrorInfo
{
private int age;
public int Age
{
get { return age; }
set { age = value; }
}

public string Error
{
get
{
return null;
}
}

public string this[string name]
{
get
{
string result = null;
if (name == "Age")
{
if (this.age < 0 || this.age > 150)
{
result = "Age must not be less than 0 or greater than 150.";
}
}
return result;
}
}
}
我知道这里发生了什么,但我不知道它对我的数据有什么影响。
什么时候使用这两个属性?假设有人设置 Age as 400:调用属性上的 setter 。错误会阻止它被设置吗?如果不是,它只是警告数字不正确,有什么办法阻止某人按原样保存信息?没有 IsValid()检查方法,有吗?
很想知道窗帘后面发生了什么。

最佳答案

Error通常不使用属性,但您必须定义它才能实现接口(interface)。
正如 decyclone 所说,验证不会阻止属性被设置为错误的值,但您可以将属性设置为默认值。
让我告诉你我是如何使用它的。我有几个 TextBox我必须验证他们拥有的值(value)。我不想在调用集合时显示带有错误的 MessageBox,而是采用“webly”方法:我想要 TextBox 的边框和背景当设置了无效值并且 TextBox 的工具提示为红色显示它得到的错误。

这是我的文本框 xaml:

<converters:ValidationConverter x:Key="validationConverter"/>
<Style x:Key="TestStepTextBox" TargetType="{x:Type TextBox}">
<Setter Property="Validation.ErrorTemplate" Value="{x:Null}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBox}">
<Border x:Name="Bd" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
<ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Converter={StaticResource validationConverter}, Path=(Validation.Errors)}"/>
<Setter Property="Background" Value="#33FF342D"/>
<Setter Property="BorderBrush" Value="#AAFF342D"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

<TextBox Name="txtRunAfter" Text="{Binding RunAfter, ValidatesOnDataErrors=True, NotifyOnValidationError=True, UpdateSourceTrigger=PropertyChanged}" Style="{DynamicResource TestStepTextBox}"/>
<TextBox Name="txtStopAfter" Text="{Binding StopAfter, ValidatesOnDataErrors=True, NotifyOnValidationError=True, UpdateSourceTrigger=PropertyChanged}" Style="{DynamicResource TestStepTextBox}"/>

一个 非常重要的说明关于转换器。当我输入一个无效的值然后我设置了一个好的值时,我遇到了一个异常。不知何故,可能与拥有 UpdateSourceTrigger=PropertyChanged 有关,有一段时间 HasError 属性为 true 但没有设置错误(参见 link )。所以这里是转换器的代码:
public class ValidationConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
ReadOnlyObservableCollection<ValidationError> errors = value as ReadOnlyObservableCollection<ValidationError>;
if (errors == null) return value;
if (errors.Count > 0)
{
return errors[0].ErrorContent;
}
return "";
}

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException("This method should never be called");
}
}

为了防止无效值被保存到我的模型层,我使用相同的方法来检查是否应该将数据提交给模型。如果该值无效,我只设置属性并且不调用模型中的一组属性。检查代码:
private int _runAfter = 0;
public int RunAfter
{
get
{
return _runAfter;
}

set
{
if (_runAfter != value)
{
_runAfter = value;
OnPropertyChanged("RunAfter");

if (validateRunAfter() == null)
setRunAfter(); //sets the property value to the model layer
}
}
}

string IDataErrorInfo.this[string columnName]
{
get
{
string message = null;
if (columnName == "RunAfter")
message = validateRunAfter();
//...
return message;
}
}

private string validateRunAfter()
{
if (value >= _order)
return "Run After value must be less than its Step Order (#) value.";

return null;
}

关于wpf - IDataErrorInfo 接口(interface)如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3109244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com