如何触发此错误模板?

时间:2011-03-09 17:26:07

标签: wpf validation datatemplate idataerrorinfo

下面是一个从绑定角度工作的模板,但错误模板没有显示,如果没有AdornedElementPlaceholder,结果看起来有点花哨。

我的视图模型实现了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>

更新

好的,我只是通过更改绑定包含ValidatesOnErrors来获取IDataErrorInfo,但错误模板仍未显示。

这是绑定

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

1 个答案:

答案 0 :(得分:3)

默认情况下,仅在更新绑定源时运行验证。在您的ItemsControl.ItemsSource绑定Sources是你的FooterViewsModels,显然永远不会更新(因为你有Mode = OneWay)。

您也可以使用DataErrorValidationRule.ValidatesOnTargetUpdated在目标更新时运行验证。该链接给出了一个例子。

请记住,Binding.ValidatesOnDataErrors属性只是将DataErrorValidationRule实例添加到Binding.ValidationRules集合的捷径。

最后,定义绑定的控件将具有Validation.Errors。在您的情况下,这是ItemsControl,而不是其中的项目。因此,我认为您需要将DataErrorValidationRule添加到Label.Content绑定中。或者您需要在ItemsControl上定义ErrorTemplate,具体取决于您的目标。