У меня есть мультитриггер, одно из условий которого
<Condition Property="Validation.HasError"
Value="True"/>
За пределами триггера я установил для шаблона ошибки значение null, и только в одном из сеттеров триггера у меня есть
<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}"/>
In 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");
}
}
}
}