MultiTrigger не соответствует условиям - PullRequest
0 голосов
/ 11 июля 2011

У меня есть мультитриггер, одно из условий которого

<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");
        }
    }
}
}

Ответы [ 2 ]

1 голос
/ 13 июля 2011

Вместо «Path = (Validation.Errors) [0] .ErrorContent» используйте «Path = (Validation.Errors) .CurrentItem.ErrorContent». Не знаю, почему это предотвращает это, учитывая, что если есть ошибка, нет никакой причины, по которой сбор ошибок будет нулевым, пустым или чем-то еще, но он работает.

0 голосов
/ 12 июля 2011

Иногда коллекция ошибок будет нулевой.

Добавить конвертер в 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...