2011-03-09 6 views
2

아래는 바인딩 관점에서 작동하는 템플릿이지만 오류 템플릿은 표시되지 않으며 AdornedElementPlaceholder가 없으면 결과가 약간 번쩍입니다.어떻게이 오류 템플릿을 트리거 할 수 있습니까?

내 뷰 모델은 IDataErrorInfo를 구현하고 일반적으로 내 바인딩의 일부로 ValidatesOnError = True를 사용하여 오류 템플릿을 트리거합니다. 이 특정 뷰 모델은 표시 전용이므로 IDataErrorInfo 인덱서는 호출되지 않습니다. IDataErrorInfo.Error뿐만 아니라 부울 IsValid 속성을 포함하여 유효성 검사와 관련된 많은 유용한 속성이 있습니다. 둘 다 적절하지 않은보기 모델에 적절하게 응답합니다.

오류를 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 바인딩에서 소스는 FooterViewsModels이며, 결코 업데이트되지 않습니다 (Mode = OneWay이기 때문에).

대상이 업데이트 될 때 DataErrorValidationRule.ValidatesOnTargetUpdated을 사용하여 유효성 검사를 실행할 수도 있습니다. 링크는 예제를 제공합니다.

Binding.ValidatesOnDataErrors 속성은 DataErrorValidationRule의 인스턴스를 Binding.ValidationRules 컬렉션에 추가하기위한 바로 가기입니다.

마지막으로 바인딩이 정의 된 컨트롤은 Validation.Errors입니다. 귀하의 경우, 그 안에 Items 항목이 아니라 ItemsControl입니다. 따라서 Label.Content 바인딩에 DataErrorValidationRule을 추가해야한다고 생각합니다. 또는 ItemsControl에서 ErrorTemplate을 정의 할 필요가 있습니다.

+0

나는 뭔가 다른 것으로 정신이 생겼다. 그래서 늦은 응답에 대해 유감스럽게 생각한다. 당신에게 대답을 지금 내리고 있지만, 나는 이번 주 언젠가 그것을 시험해 볼 기회를 얻지 못할 것입니다. (나는 질문이나 추가 코멘트가있을 수 있습니다. – Berryl

관련 문제