2009-07-29 30 views
3

我有一個UserControl包含其他控件和TextBox。它有一個Value屬性,它綁定到TextBox文本並且ValidatesOnDataErrors設置爲True。在WPF中的不同控件上顯示驗證錯誤模板

Value屬性綁定中發生驗證錯誤時,錯誤模板(標準紅色邊框)顯示在整個UserControl的周圍。

有沒有辦法僅在TextBox附近展示? 我想能夠使用任何錯誤模板,所以簡單地將文本框放在邊框上,並綁定它的顏色或Validation.HasError不是一個選項。

這裏是我的代碼:

<DataTemplate x:Key="TextFieldDataTemplate"> 
    <c:TextField DisplayName="{Binding Name}" Value="{Binding Value, Mode=TwoWay, ValidatesOnDataErrors=True}"/> 
</DataTemplate> 

<controls:FieldBase x:Name="root"> 
<DockPanel DataContext="{Binding ElementName=root}"> 
    <TextBlock Text="{Binding DisplayName}"/> 
    <TextBox x:Name="txtBox"     
      Text="{Binding Value, Mode=TwoWay, ValidatesOnDataErrors=True}" 
      IsReadOnly="{Binding IsReadOnly}"/> 
</DockPanel> 

用戶控件(FieldBase)比綁定到模型視圖執行驗證。

回答

2

要完成此任務我已使用此解決方案。它使用轉換器,通過將(Validation.Errors).CurrentItem轉換爲Thickness來「隱藏」邊界。

<Grid> 
    <Grid.Resources> 
     <data:ValidationBorderConverter 
      x:Key="ValidationBorderConverter" /> 
    </Grid.Resources> 
    <Border 
     BorderBrush="#ff0000" 
     BorderThickness="{Binding 
      ElementName=myControl, 
      Path=(Validation.Errors).CurrentItem, 
      onverter={StaticResource ValidationBorderConverter}}"> 
     <TextBox 
      ToolTip="{Binding 
       ElementName=myControl, 
       Path=(Validation.Errors).CurrentItem.ErrorContent}" /> 
    </Border> 
</Grid> 

ValidationBorderConverter類是非常簡單的:

[ValueConversion(typeof(object), typeof(ValidationError))] 
public sealed class ValidationBorderConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, 
      System.Globalization.CultureInfo culture) 
    { 
     return (value == null) ? new Thickness(0) : new Thickness(1); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, 
      System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
}