2015-03-12 3 views
0

В моем приложении у меня есть ControlTemplate, который я использую, чтобы показать, что вход TextBox недействителен. ControlTemplate определяется как:Различные контрольные шаблоны для ErrorTemplate

<ControlTemplate x:Key="TextBoxErrorTemplate" TargetType="Control"> 
    <Grid ClipToBounds="False"> 
     <Border BorderBrush="Red" BorderThickness="1" Margin="-1"> 
      <AdornedElementPlaceholder Name="adornedElement" /> 
     </Border> 
     <Image HorizontalAlignment="Right" VerticalAlignment="Top" 
       Width="16" Height="16" Margin="0,-9,-8,0" Source="pack://application:,,,/UI.Resources;component/Graphics/Error_16_16.png" 
       ToolTip="{Binding ElementName=adornedElement, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" /> 
    </Grid> 
</ControlTemplate> 

И использование является:

<TextBox Grid.Row="1" Margin="0,5" 
     Text="{Binding UserGroup.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" 
     Validation.ErrorTemplate="{StaticResource TextBoxErrorTemplate}"/> 

UserGroup-класс реализует IDataErrorInfo -INTERFACE. Небольшая часть класса выглядит следующим образом:

public class UserGroup 
{ 
    public string Name 
    { 
     get { return Get(() => Name); } 
     set { Set(() => Name, value); } 
    } 

    public bool IsDuplicate 
    { 
     get { return Get(() => IsDuplicate); } 
     set { Set(() => IsDuplicate, value); } 
    } 

    public bool IsSimilar 
    { 
     get { return Get(() => IsSimilar); } 
     set { Set(() => IsSimilar, value);} 
    } 
} 

И реализация добытчика, который требуется IDataErrorInfo выглядит следующим образом:

public string this[string columnName] 
{ 
    get 
    { 
     string result = string.Empty; 
     string namePropertyName = GetPropertyNameFromExpression(() => Name); 
     string isDuplicatePropertyName = GetPropertyNameFromExpression(() => IsDuplicate); 
     string isSimilarPropertyName = GetPropertyNameFromExpression(() => IsSimilar); 

     if (columnName == namePropertyName) 
     { 
      if(IsSimilar) 
      { 
       result = "Be careful with similar group-names!"; 
       if (!Error.Contains(isSimilarPropertyName)) 
       { 
        Error += isSimilarPropertyName; 
       } 
      } 
      else 
      { 
       Error = Error.Replace(isSimilarPropertyName, string.Empty); 
      } 

      if (IsDuplicate) 
      { 
       result = "Duplicate names are not allowed!"; 
       if (!Error.Contains(isDuplicatePropertyName)) 
       { 
        Error += isDuplicatePropertyName; 
       } 
      }   
      else 
      { 
       Error = Error.Replace(isDuplicatePropertyName, string.Empty); 
      } 
     }  
     return result; 
    } 
} 

Так что если IsSimilar или IsDuplicate, истинно TextBoxErrorTemplate- ControlTemplate будет используемый.

Я хочу, чтобы текст TextBoxErrorTemplate использовался только в том случае, если IsDuplicate равно true.

В случае, IsSimilar равно правда, я хочу использовать следующие ControlTemplate:

<ControlTemplate x:Key="TextBoxWarningTemplate" TargetType="Control"> 
    <Grid ClipToBounds="False"> 
     <Border BorderBrush="Orange" BorderThickness="1" Margin="-1"> 
      <AdornedElementPlaceholder Name="adornedElement" /> 
     </Border> 
     <Image HorizontalAlignment="Right" VerticalAlignment="Top" 
       Width="16" Height="16" Margin="0,-9,-8,0" Source="pack://application:,,,/UI.Resources;component/Graphics/Warning_16_16.png" 
       ToolTip="{Binding ElementName=adornedElement, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" /> 
    </Grid> 
</ControlTemplate> 

Есть ли способ для достижения этой цели? Мой первый подход для наложения TextBox с Border и только показать, если IsSimilar верно, но это не очень хорошо выглядит ...

Я прочитал о TemplateSelector, но только в контексте DataGridTemplateColumn

ответ

0

Я решил это самостоятельно. Решение является только одним ControlTemplate, где ImageSource и BorderBrush привязаны к свойству UserGroup-Property, и решение выполняется в двух конвертерах.

ControlTemplate выглядит следующим образом:

<ControlTemplate x:Key="TextBoxErrorTemplate" TargetType="Control"> 
    <Grid ClipToBounds="False"> 
     <Border BorderThickness="1" Margin="-1" 
       BorderBrush="{Binding DataContext.UserGroup, Converter={converters:UserGroupToBrushConverter}, 
           RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"> 
      <AdornedElementPlaceholder Name="adornedElement" /> 
     </Border> 
     <Image HorizontalAlignment="Right" VerticalAlignment="Top" 
       Width="16" Height="16" Margin="0,-9,-8,0" 
       Source="{Binding DataContext.UserGroup, Converter={converters:UserGroupToImageSourceConverter}, 
         RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" 
       ToolTip="{Binding ElementName=adornedElement, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" /> 
    </Grid> 
</ControlTemplate> 
Смежные вопросы