我有一个具有一个属性的Model
。该CCD_ 2继承自实现INotifyPropertyChanged
和IDataInfoError
的基本模型。在我的属性上方,我有ValidationAttribute
必需项,并带有一条错误消息,我想将其带到工具提示中。因此,我的视图中有一个文本框。
我的建议是:当文本框为空时,验证有效。文本框有一个红色边框。当文本框为空并且我在其中写入内容时,我的输出窗口中会出现错误。
System.Windows.Data错误:17:无法从"(Validation.Errors("(类型为"ReadOnlyObservableCollection"1"(中获取"Item[]"值(类型为"ValidationError"(。BindingExpression:路径=(0([0]。ErrorContent;DataItem='TextBox'(名称=''(;目标元素是"TextBox"(名称="(;目标属性为"ToolTip"(类型为"Object"(ArgumentOutOfRangeException:"System.ArgumentOut OfRangeException:指定的参数超出了有效值的范围。参数名称:index‘
要重现错误:型号
public class ModelBase : INotifyPropertyChanged, IDataErrorInfo
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public string Error { get { return null; } }
public string this[string columnName]
{
get
{
var validationResults = new List<ValidationResult>();
if (Validator.TryValidateProperty(
GetType().GetProperty(columnName).GetValue(this)
, new ValidationContext(this) { MemberName = columnName }
, validationResults))
return null;
return validationResults.First().ErrorMessage;
}
}
}
public class Model : ModelBase
{
private string name;
[Required(ErrorMessage = "Wrong")]
public string Name
{
get { return name; }
set
{
name = value;
OnPropertyChanged();
}
}
}
查看
<Window.Resources>
<Style TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent}" />
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<StackPanel>
<TextBox Margin="10" Text="{Binding Name, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, NotifyOnValidationError=True, Mode=TwoWay}"></TextBox>
</StackPanel>
当索引器返回null
时,位置0处没有ValidationError
。绑定到(Validation.Errors).CurrentItem.ErrorContent
而不是(Validation.Errors)[0].ErrorContent
应该可以修复绑定错误:
<Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors).CurrentItem.ErrorContent}" />