MultiTrigger似乎没有遵循条件

时间:2011-07-11 19:20:08

标签: .net wpf triggers

我有一个多重触发器,其中一个条件是

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

2 个答案:

答案 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;
}