我有一个多重触发器,其中一个条件是
<Condition Property="Validation.HasError"
Value="True"/>
在触发器之外,我将错误模板设置为null,并且只在其中一个触发器的setter中设置
<Setter Property="ToolTip"
Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
但由于某种原因,有时候我仍然会得到索引超出范围的异常,即我正在尝试访问空错误集合的元素0。
这似乎发生在控件的支持数据我试图做的事情,但我不知道是什么导致它尝试创建工具提示,即使没有任何错误。
编辑:我删除了尽可能多的内容,以下是剩下的内容。在数据绑定文本框中键入内容然后切换焦点时会出现异常。在App.xaml中,在应用程序资源下
<Style TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError"
Value="True">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
在MainWindow.xaml.cs(这是启动窗口)
public MainWindow()
{
InitializeComponent();
this.DataContext = new Bar();
}
在MainWindow.xaml中,相关绑定
<TextBox Text="{Binding Foo, ValidatesOnDataErrors=True}"/>
在Bar.cs
public sealed class Bar : IDataErrorInfo, INotifyPropertyChanged
{
// Standard PropertyChanged, OnPropertyChanged removed
// Foo does have a backing field and notifies in the
// setter but those have been removed for brevity
public string Foo {get;set;}
public string Error
{
get { return ""; }
}
public string this[string columnName]
{
get
{
switch (columnName)
{
case "Foo":
if (string.IsNullOrEmpty(Foo))
return "The foo must not be empty.";
return "";
default:
throw new ArgumentException("columnName");
}
}
}
}
答案 0 :(得分:1)
使用“Path =(Validation.Errors).CurrentItem.ErrorContent”而不是“Path =(Validation.Errors)[0] .ErrorContent”。不知道为什么这会阻止它,考虑到如果有错误,没有理由将错误集合为null或空或其他什么,但它可以工作。
答案 1 :(得分:0)
有时错误集合将为null。
将转换器添加到Xaml
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors),
Converter={StaticResource ValidationErrorConverter}}"/>
您的转换器应如下所示:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
ReadOnlyObservableCollection<ValidationError> errors = value as ReadOnlyObservableCollection<ValidationError>;
if (errors == null)
{
return String.Empty;
}
return errors.Count > 0 ? errors[0].ErrorContent : String.Empty;
}