如何获取DataTemplate.DataTrigger检查大于还是小于?

以下DataTemplate.DataTrigger使年龄显示为红色,如果它等于 30。

如果年龄大于 30岁,我该如何使年龄显示为红色?

 <DataTemplate DataType="{x:Type local:Customer}"> <Grid x:Name="MainGrid" Style="{StaticResource customerGridMainStyle}"> <Grid.ColumnDefinitions> <ColumnDefinition Width="100"/> <ColumnDefinition Width="150"/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition/> <RowDefinition/> </Grid.RowDefinitions> <TextBlock Grid.Column="0" Grid.Row="0" Text="First Name" Margin="5"/> <TextBlock Grid.Column="1" Grid.Row="0" Text="{Binding FirstName}" Margin="5"/> <TextBlock Grid.Column="0" Grid.Row="1" Text="Last Name" Margin="5"/> <TextBlock Grid.Column="1" Grid.Row="1" Text="{Binding LastName}" Margin="5"/> <TextBlock Grid.Column="0" Grid.Row="2" Text="Age" Margin="5"/> <TextBlock x:Name="Age" Grid.Column="1" Grid.Row="2" Text="{Binding Age}" Margin="5"/> </Grid> <DataTemplate.Triggers> <DataTrigger Binding="{Binding Path=Age}"> <DataTrigger.Value>30</DataTrigger.Value> <Setter TargetName="Age" Property="Foreground" Value="Red"/> </DataTrigger> </DataTemplate.Triggers> </DataTemplate> 

您可以创build一个IValueConverter ,它将基于CutOff的整数转换为布尔值。 然后使用True (或False ,取决于你正在返回)的DataTrigger.Value

如果我没有记错的话,WPF DataTrigger是完全相等的比较器。

所以类似于:

 public class CutoffConverter : IValueConverter { object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return ((int)value) > Cutoff; } object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } public int Cutoff { get; set; } } 

然后使用下面的XAML。

 <Window.Resources> <myNamespace:CutoffConverter x:Key="AgeConverter" Cutoff="30" /> </Window.Resources> <DataTemplate.Triggers> <DataTrigger Binding="{Binding Path=Age, Converter={StaticResource AgeConverter}}"> <DataTrigger.Value>true</DataTrigger.Value> <Setter TargetName="Age" Property="Foreground" Value="Red"/> </DataTrigger> </DataTemplate.Triggers> 

我build议使用一个IValueConverter绑定到年龄TextBlockForeground元素,并隔离着色逻辑。

 <TextBlock x:Name="Age" Grid.Column="1" Grid.Row="2" Text="{Binding Age}" Foreground="{Binding Path=Age, Converter={StaticResource AgeToColorConverter}}" Margin="5"/> 

然后在代码中:

 [ValueConversion(typeof(int), typeof(Brush))] public class AgeToColorConverter : IValueConverter { public object Convert(object value, Type target) { int age; Int32.TryParse(value.ToString(), age); return (age >= 30 ? Brushes.Red : Brushes.Black); } } 

其他答案的工作,但这里也是使用MVVM和INotifyPropertyChanged的权力更简单(?)的方式。

Age属性一起创build另一个属性,它是一个名为IsAgeValid的布尔值。 IsAgeValid只是一个按需检查,不需要OnNotify调用。

由于它不需要OnNotify调用,要将更改推送到Xaml,请将OnNotifyPropertyChanged放置在Age设置器中。 该属性IsAgeValid将具有该风格消耗,并会得到任何可能发生的年龄状态的变化。

一旦设置,当然绑定样式触发器为false和true相应的IsAgeValid结果。

 public bool IsAgeValid{ get { return Age > 30; } } public int Age { get { return _Age; } set { _Age=value; OnPropertyChanged("Age"); OnPropertyChanged("IsAgeValid"); // When age changes, so does the // question *is age valid* changes. So // update the controls dependent on it. } }