Ошибка привязки шаблона wpf - PullRequest
2 голосов
/ 10 марта 2011

Я получаю эту ошибку в консоли при запуске моего приложения:

System.Windows.Data Error: 17 : Cannot get 'Item[]' value (type 'ValidationError') from '(Validation.Errors)' (type 'ReadOnlyObservableCollection`1'). BindingExpression:Path=AdornedElement.(0)[0].ErrorContent; DataItem='AdornedElementPlaceholder' (Name='placeholder'); target element is 'TextBlock' (Name=''); target property is 'ToolTip' (type 'Object') ArgumentOutOfRangeException:'System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: index'
A first chance exception of type 'NHibernate.Validator.Exceptions.ValidatorConfigurationException' occurred in NHibernate.Validator.dll

Одна из вещей, о которой я пока не понимаю, это то, что поведение приложения в порядке, как и модульtests.

Я (очевидно) использую валидатор NHibernate за кулисами реализации IDataErrorInfo, но суть в том, что и IDataErrorInfo.Error, и IDataErrorInfo [columnName] вернут одну строку в случае ошибкии null, если его нет.

Я бы предположил, что возникает исключение, потому что когда нет ошибки, нет индекса, но привязка для моей подсказки об ошибке кажется типичной для примеров того, как это сделать..

Ниже приведена привязка для моего шаблона ошибки.

Вопросы:

  1. не должен ли IDataErrorInfo [columnName] возвращать ноль, если ошибки не найдены?
  2. отсутствует ли мой шаблон ошибки?часть validation.HasError ??
  3. это даже проблема?
  4. если это проблема, и она, скорее всего, связана с валидатором NHib и предложениями?

стиль текстового поля с шаблоном ошибки:

<Style TargetType="{x:Type TextBox}">
    <Setter Property="Margin" Value="0,0,16,0" />        
    <!-- Error display -->
    <Setter Property="Validation.ErrorTemplate">
        <Setter.Value>
            <ControlTemplate>
                <DockPanel LastChildFill="True">
                    <TextBlock DockPanel.Dock="Right" Text=" *" 
                               Foreground="Red" 
                               FontWeight="Bold" FontSize="16" 
                               ToolTip="{Binding ElementName=placeholder, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"/>
                    <Border BorderBrush="Red"  BorderThickness="1">
                        <AdornedElementPlaceholder Name="placeholder"></AdornedElementPlaceholder>
                    </Border>
                </DockPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="True">
            <Setter Property="Background" Value="LightYellow"/>
        </Trigger>
    </Style.Triggers>
</Style>

Ответы [ 2 ]

6 голосов
/ 10 марта 2011
  1. На основании документации IDataErrorInfo по умолчанию возвращается пустая строка. Поэтому, если ошибки нет, вам, вероятно, следует вернуть string.Empty.

  2. Из блога Джоша Смита вы можете использовать CurrentItem вместо [0], чтобы избежать ошибок.

0 голосов
/ 10 марта 2011

Чисто из памяти (так, скорее всего, неправильно). Я думаю, что это также может произойти, когда у вас фактически нет уровня надстройки в визуальной иерархии; вы случайно не настраивали шаблоны окон? Очевидно, не могу вспомнить точное исключение, но что-то подобное случилось со мной некоторое время назад. Самый простой способ исключить это - поместить слой adorner вручную где-нибудь - вы можете посмотреть на шаблон элемента управления Window по умолчанию на MSDN, чтобы увидеть, как он используется.

edit: на самом деле это должно привести к NRE, как я уже сказал, скорее всего, неправильно.

...