2016-12-22 11 views
-1

사용자 정의 유효성 검사기 및 오류 템플릿을 만들었습니다. 오류 템플릿은 다음과 같습니다.다른 컨트롤과 중복 된 사용자 정의 유효성 검사 오류 메시지

<ControlTemplate x:Key="errorTmp"> 
     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="auto"></RowDefinition> 
       <RowDefinition Height="auto"></RowDefinition> 
      </Grid.RowDefinitions> 
      <Border Grid.Row="1" BorderBrush="Red" BorderThickness="1"> 
       <AdornedElementPlaceholder x:Name="Adorner"/> 
      </Border>     
      <TextBlock Grid.Row="0" Foreground="Red" Text="{Binding ElementName=Adorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" Margin="0,0,0,5"></TextBlock> 
     </Grid> 
    </ControlTemplate> 

오류 메시지가 다른 컨트롤에 중첩되어 있습니다.

enter image description here

+0

나는 이것이 adorner 레이어 때문이라고 알고 있습니다. 그리고 툴팁에 오류 메시지를 표시하고 싶지 않습니다. 컨트롤이 높이를 조정하여 오류 메시지를위한 공간을 만들어야합니다. 나는 웹에서 많은 것을 찾았지만 어떤 해결책도 찾지 못했습니다. – Rudra

답변

1

당신은 adorner 계층의 요소에 대한 공간을 예약해야합니다. Validation.HasError 속성이 true를 반환하면 TextBox 컨트롤의 Margin 속성을 늘려서이 작업을 수행 할 수 있습니다. 당신이 당신의 Validation.ErrorTemplate에서 그리드의 첫 번째 행과 동일한 높이로 텍스트 상자의 위쪽 여백을 설정할 수 있습니다이 경우

: adorner의 렌더링

<TextBox /> 

<TextBox Text="{Binding Username, UpdateSourceTrigger=PropertyChanged, ValidatesOnNotifyDataErrors=True}"> 
    <Validation.ErrorTemplate> 
     <ControlTemplate> 
      <Grid> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="20"></RowDefinition> 
        <RowDefinition Height="auto"></RowDefinition> 
       </Grid.RowDefinitions> 
       <Border Grid.Row="1" BorderBrush="Red" BorderThickness="1"> 
        <AdornedElementPlaceholder x:Name="Adorner"/> 
       </Border> 
       <TextBlock Grid.Row="0" Foreground="Red" Text="{Binding ErrorContent}"></TextBlock> 
      </Grid> 
     </ControlTemplate> 
    </Validation.ErrorTemplate> 
    <TextBox.Style> 
     <Style TargetType="TextBox"> 
      <Style.Triggers> 
       <Trigger Property="Validation.HasError" Value="True"> 
        <!-- increase the top margin of the TextBox in order for the error content not to overlap the control above --> 
        <Setter Property="Margin" Value="0 20 0 0" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </TextBox.Style> 
</TextBox> 

렌더링에서 독립적 adorner가 바인딩 된 UIElement의 경우 Adorner가 표시 될 때 TextBox가 자동으로 위치를 조정할 방법이 없습니다. 그래서 adorner 요소의 공간을 명시 적으로 예약해야합니다.