2016-01-10 2 views
0

В следующем триггере, если TextBoxText значение пусто, Border Цвет будет красным.Пользовательский триггер для длины текста TextBox

<Style TargetType="TextBox" > 
    <Style.Triggers> 
     <Trigger Property="Text" Value="">  
      <Setter Property="BorderBrush" Value="Red"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

Как я могу (с помощью триггера) сделать это, когда длина текста не превышает 4 символов, граница будет красной?

Спасибо!

+0

Я думаю, что вы хотите сделать проверку данных. WPF имеет некоторые инструменты для этого - взгляните на [http://blog.magnusmontin.net/2013/08/26/data-validation-in-wpf/](http://blog.magnusmontin.net/2013/ 08/26/data-validation-in-wpf /) – jHilscher

+0

Если вы действительно хотите сделать это с помощью триггера стиля, вам придется написать свой собственный конвертер. – jHilscher

+0

Вы можете проверить, соответствует ли длина текста 4 точным, тогда цвет может быть красным. Но для менее чем, больше, чем сценариев, вы должны использовать поведение. – AnjumSKhan

ответ

1

Если вы действительно хотите Style.Trigger решения на базе вам нужен преобразователь:

Преобразователь преобразует входную строку в булевой, погоду вход соответствует вашим критериям. В этом примере длина текста должна быть больше 4.

конвертер Класс:

public class LengthConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var text = value as string; 

     if (text != null) { 
      return text.Length > 4; 
     } 
     return false; 
    } 

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

} 

XAML:

<Window.Resources> 
    <conv:LengthConverter x:Key="converter" /> 
    <Style TargetType="TextBox" > 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=Text, 
        RelativeSource={RelativeSource Self}, 
        Converter={StaticResource converter}}" 
        Value="False"> 
       <Setter Property="BorderBrush" Value="Red"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

</Window.Resources> 

Но надлежащая проверка (например, в ответ Сабольч Dézsi в), вероятно, является лучшим подходом.

+0

спасибо! Можете ли вы объяснить, почему вы сделали «Преобразователь StaticResource»? – jordan

+0

это просто ссылка на , который ссылается на LengthConverter – jHilscher

+0

Просто хотел добавить, что вам нужно определить «conv», чтобы это работало. Добавьте «xmlns: conv =» clr-namespace: YOURNAMESPACE »к вашему определению окна. –

2

Я уверен, что вы хотите реализовать какую-то проверку.

Вместо использования триггера я использовал встроенные функции проверки WPF.

Один из способов сделать это - реализовать интерфейс IDataErrorInfo в вашей модели (модели). Реализация

public class MainWindowViewModel : INotifyPropertyChanged, IDataErrorInfo 

Error недвижимость:

public string Error { get { return null; } } 

реализация индексатор по:

public string this[string columnName] 
{ 
    get 
    { 
     if(columnName == "SomeRandomText") 
     { 
      if(string.IsNullOrEmpty(SomeRandomText) || SomeRandomText.Length < 4) 
      { 
       return "Text should be at least four characters long"; 
      } 
     } 

     return null; 
    } 
} 

В XAML:

<TextBox Text="{Binding SomeRandomText, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" /> 

Результат:

Result

Если вы не хотите, чтобы реализовать интерфейс IDataErrorInfo вы можете использовать ValidationRule с.

То же самое достигается с ValidationRule:

<Binding Path="SomeRandomText" ValidatesOnDataErrors="True" UpdateSourceTrigger="PropertyChanged"> 
    <Binding.ValidationRules> 
     <local:LengthValidationRule RequiredLength="4" /> 
    </Binding.ValidationRules> 
</Binding> 

И ValidationRule:

public class LengthValidationRule : ValidationRule 
{ 
    public int RequiredLength { get; set; } 

    public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
    { 
     var text = (string)value; 

     if(string.IsNullOrEmpty(text) || text.Length < RequiredLength) 
     { 
      return new ValidationResult(false, "Text should be at least four characters long"); 
     } 

     return ValidationResult.ValidResult; 
    } 
} 

Если вы хотите иметь другую границу вы можете посмотреть в прикрепленном собственности Validation.ErrorTemplate.

Если вы действительно хотите сделать это с помощью триггера, как упоминалось выше, вы можете сделать это с помощью преобразователя, названного, например, LessThanConverter. Требуется LengthText, а другой номер, который вы хотите сравнить с ConverterParameter, и вернет bool.

0

Эталоны: Microsoft.Expression.Interactions.dll, и System.Windows.Interactivity.dll. На моей машине они находятся в: C:\Program Files (x86)\Microsoft SDKs\Expression\Blend\.NETFramework\v4.0\Libraries

<TextBox x:Name="textBox" HorizontalAlignment="Left" Margin="96,0,0,164.04" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Bottom">    
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="TextChanged"> 
        <i:Interaction.Behaviors> 
         <ei:ConditionBehavior> 
          <ei:ConditionalExpression> 
           <ei:ComparisonCondition Operator="LessThan" RightOperand="4" LeftOperand="{Binding Text.Length, ElementName=textBox}"/> 
          </ei:ConditionalExpression> 
         </ei:ConditionBehavior> 
        </i:Interaction.Behaviors> 
        <ei:ChangePropertyAction PropertyName="BorderBrush"> 
         <ei:ChangePropertyAction.Value> 
          <SolidColorBrush Color="#FFD41717"/> 
         </ei:ChangePropertyAction.Value> 
        </ei:ChangePropertyAction> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
     </TextBox> 
Смежные вопросы