2011-06-29 82 views
4

我有一個控件模板的用戶控件來顯示驗證錯誤,驗證模板:WPF驗證控件模板重疊

<ControlTemplate x:Key="TextBoxPropertyValidationTemplate"> 
     <StackPanel> 
      <Border BorderBrush="Red" BorderThickness="1"> 
       <AdornedElementPlaceholder x:Name="MyAdorner" /> 
      </Border> 

      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto" /> 
        <ColumnDefinition Width="*" /> 
       </Grid.ColumnDefinitions> 
       <Image Grid.Column="0" MaxHeight="16" MaxWidth="16" 
         Source="{Binding Source={StaticResource ValidationIcon}, Converter={StaticResource UriConverter}}" 
         Margin="1" RenderOptions.BitmapScalingMode="HighQuality" 
         VerticalAlignment="Center" HorizontalAlignment="Center" /> 
       <TextBlock VerticalAlignment="Center" HorizontalAlignment="Left" 
          Text="{Binding ElementName=MyAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" 
          TextWrapping="Wrap" Grid.Column="1" FontSize="10" Foreground="Red" /> 
      </Grid> 

     </StackPanel> 
    </ControlTemplate> 

而且我似乎無法避開一個相當討厭的問題,它看起來像這樣的:

validation

我一直在努力與利潤率玩的用戶控制和模板上也有一些身高=汽車等,但所有這些都沒有真正的幫助。任何想法的人?

如果這有助於主用戶控件(它嵌套與驗證的控件)與AdornerDecorator在一個TabItem中。

任何幫助表示讚賞。

+0

你想讓這看起來像什麼?我看到了重疊,但我不清楚你如何期待它的行爲。 – Matt

回答

3

我想說這是因爲您的錯誤消息是在AdornerLayer,它不參與您的控件相同的佈局。 MSDN says「裝飾者的渲染獨立於渲染裝飾者所綁定的UIElement。」這就是爲什麼這條信息只能放在一切之上。

您可以將錯誤文本放入原始模板中,根據Validation.HasError將其隱藏並將其包含在佈局過程中。

但是,如果發生驗證錯誤,更改控件的佈局可能不是最好的方法。您可能會考慮在工具提示中提供其他信息。

+0

好的答案,夠公平的......我不想讓我的佈局跳轉,所以它看起來像它的工具提示。謝謝 – hyp

1

或者,也可以不使用ControlTemplate,而是將錯誤消息TextBlock放在TextBox旁邊,並將其Text屬性設置爲綁定TextBox的ErrorContent。

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 
    <TextBox x:Name="txtName" Grid.Row="0"> 
     <TextBox.Text> 
      <Binding Path="Name" NotifyOnValidationError="True" ValidatesOnExceptions="True" UpdateSourceTrigger="PropertyChanged"> 
       <Binding.ValidationRules> 
        <common:RequiredFieldValidationRule/> 
       </Binding.ValidationRules> 
      </Binding> 
     </TextBox.Text> 
    </TextBox> 
    <TextBlock Grid.Row="1" Text="{Binding ElementName=txtName,Path=(Validation.Errors)[0].ErrorContent}" 
       Visibility="{Binding ElementName=txtName,Path=Validation.HasError,Converter=...}" /> 
</Grid>