下面是一个从绑定角度工作的模板,但错误模板没有显示,如果没有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>
答案 0 :(得分:3)
默认情况下,仅在更新绑定源时运行验证。在您的ItemsControl.ItemsSource绑定Sources是你的FooterViewsModels,显然永远不会更新(因为你有Mode = OneWay)。
您也可以使用DataErrorValidationRule.ValidatesOnTargetUpdated在目标更新时运行验证。该链接给出了一个例子。
请记住,Binding.ValidatesOnDataErrors属性只是将DataErrorValidationRule实例添加到Binding.ValidationRules集合的捷径。
最后,定义绑定的控件将具有Validation.Errors。在您的情况下,这是ItemsControl,而不是其中的项目。因此,我认为您需要将DataErrorValidationRule添加到Label.Content绑定中。或者您需要在ItemsControl上定义ErrorTemplate,具体取决于您的目标。