2011-03-09 59 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