2011-03-09 53 views
2

下面是一个模板,从绑定的角度来看,但错误模板不显示,没有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> 

UPDATE

好吧,我得到IDataErrorInfo的通过改变我的结合,包括ValidatesOnErrors在刚刚打完,但错误模板仍没有出现。

这里是结合

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

回答

3

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

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

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

最后,绑定被定义的控件将有Validation.Errors。在你的情况下,这是ItemsControl,而不是它里面的项目。所以,我相信你需要将DataErrorValidationRule添加到Label.Content绑定中。或者你需要在ItemsControl上定义ErrorTemplate,具体取决于你要做什么。

+0

我分心了别的东西,所以很抱歉迟到的回应。我现在给你答案,但我不会有机会尝试,直到本周的某个时候(这意味着我可能有一个后续问题或额外的评论,但看起来目标。 – Berryl 2011-03-26 13:02:45