Как я могу вызвать этот шаблон ошибок? - PullRequest
2 голосов
/ 09 марта 2011

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

В моих моделях представления реализован IDataErrorInfo, и обычно я запускаю шаблон ошибки, имея ValidatesOnError = True как часть моей привязки. Эта конкретная модель представления только для отображения, поэтому индексатор IDataErrorInfo никогда не вызывается. У меня есть ряд полезных свойств, связанных с проверкой, в том числе логическое свойство IsValid, а также IDataErrorInfo.Error, оба из которых правильно реагируют на недопустимую модель представления.

Должен ли я перевести ошибку в ValidationResult и вызвать ее таким образом? Или есть что-то попроще?

Приветствия
Berryl

текущий шаблон

<!-- FooterViewModel DataTemplate -->
<DataTemplate DataType="{x:Type model:FooterViewModel}">

    <Label x:Name="lblTotalTime"
        Style="{StaticResource FooterStyle}" 
        Content="{Binding TotalTime, Converter={StaticResource TotalAmountConv}}" >
        <Label.ToolTip>
            <TextBlock Text="{Binding FeedbackMessage}" ></TextBlock>
        </Label.ToolTip>
        <Validation.ErrorTemplate>
            <ControlTemplate>
                <DockPanel LastChildFill="True">
                    <TextBlock DockPanel.Dock="Right" Text=" *" 
                               Foreground="Red" 
                               FontWeight="Bold" FontSize="16" 
                               />
                    <Border BorderBrush="Red"  BorderThickness="1">
                        <AdornedElementPlaceholder Name="placeholder"></AdornedElementPlaceholder>
                    </Border>
                </DockPanel>
            </ControlTemplate>
        </Validation.ErrorTemplate>
    </Label>

    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding IsValid}" Value="False">
            <Setter TargetName="lblTotalTime" Property="Control.BorderBrush" Value="Red"/>
            <Setter TargetName="lblTotalTime" Property="Control.BorderThickness" Value="1"/>
            <Setter TargetName="lblTotalTime" Property="Control.Background" Value="LightYellow"/>
        </DataTrigger>
    </DataTemplate.Triggers>

</DataTemplate>

UPDATE

Хорошо, я получаю IDataErrorInfo, чтобы включить его, просто изменив привязку для включения ValidatesOnErrors, НО шаблон ошибки все еще не отображается.

Вот привязка

    <ItemsControl 
        ItemsSource="{Binding Path=FooterViewModels, Mode=OneWay, ValidatesOnDataErrors=True}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>

1 Ответ

3 голосов
/ 11 марта 2011

По умолчанию проверка выполняется только при обновлении источника привязки.В вашей привязке ItemsControl.ItemsSource Sources - это ваши FooterViewsModels, которые, очевидно, никогда не будут обновлены (потому что у вас Mode = OneWay).

Вы можете использовать DataErrorValidationRule.ValidatesOnTargetUpdated для запуска проверкикогда цель также обновляется.Ссылка дает пример.

Имейте в виду, что свойство Binding.ValidatesOnDataErrors - это просто краткий путь для добавления экземпляра DataErrorValidationRule в коллекцию Binding.ValidationRules.

Наконец, элемент управления для определения привязки будет иметь Validation.Errors .В вашем случае это ItemsControl, а не элементы внутри него.Поэтому я считаю, что вам нужно добавить DataErrorValidationRule в вашу привязку Label.Content.Или вам нужно определить свой ErrorTemplate в ItemsControl, в зависимости от того, что вы собираетесь.

...