如何获取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
绑定到年龄TextBlock
的Foreground
元素,并隔离着色逻辑。
<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. } }