2016-01-10 17 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的转换器来做到这一点。这将需要TextLength以及您想要与ConverterParameter进行比较的另一个数字,并且将返回bool

0

参考组件: Microsoft.Expression.Interactions.dllSystem.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>