wpf xaml datatemplate datatrigger

wpf - ¿Cómo obtener DataTemplate.DataTrigger para buscar mayor o menor que?



xaml (3)

El siguiente DataTemplate.DataTrigger hace que la visualización de la edad sea roja si es igual a 30.

¿Cómo hago que la edad se muestre en rojo si es mayor que 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>


Creo que hay una forma más sencilla de lograr el objetivo utilizando los poderes de MVVM e INotifyPropertyChanged .

Con la propiedad Age crea otra propiedad que será un booleano llamado IsAgeValid . El IsAgeValid simplemente será un cheque bajo demanda que técnicamente no necesita una llamada OnNotify . ¿Cómo?

Para hacer que los cambios se envíen al Xaml, coloque OnNotifyPropertyChanged for IsAgeValid dentro del setter Age .

Cualquier enlace a IsAgeValid tendrá un mensaje de notificación enviado en cualquier cambio de Age que sea realmente lo que se está mirando.

Una vez configurada, por supuesto vincular el disparador de estilo para falso y verdadero según el resultado de 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. } }


Puede crear un IValueConverter , que convierte un entero en un booleano basado en CutOff . Luego use DataTrigger.Value of True (o False , dependiendo de lo que esté devolviendo).

WPF DataTrigger s son estrictamente comparadores de igualdad si no recuerdo mal.

Entonces algo similar a:

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; } }

Luego usa el siguiente 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>


Recomiendo usar un IValueConverter para enlazar al elemento en Foreground de Age TextBlock y aislar la lógica de coloreo allí.

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

Luego en el Código:

[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); } }