2009-04-27 21 views
37

La siguiente DataTemplate.DataTrigger hace que la pantalla roja de edad si es igual a 30.¿Cómo obtener DataTemplate.DataTrigger para buscar mayor o menor que?

¿Cómo hago el rojo visualización de la edad 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> 

Respuesta

63

Se puede crear un IValueConverter, que convierte un entero a un valor lógico basado en la CutOff. Luego use DataTrigger.Value de True (o False, dependiendo de lo que devuelva).

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

Así que 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; } 
} 

A continuación, utilice 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> 
+15

también, puede utilizar ConverterParameter a pasar en el valor de corte si necesita valores diferentes para diferentes factores desencadenantes: = encuadernación "{ruta de enlace = Edad, convertidor = {StaticResource AgeConverter}, ConverterParameter = 30}" –

10

me gustaría recomendar el uso de un IValueConverter para unirse al elemento Foreground de la Edad TextBlock y aislar la lógica para colorear 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); 
    } 
} 
8

Creo que hay una manera más sencilla de acheiving el objetivo mediante el uso de los poderes de MVVM y INotifyPropertyChanged.


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

Para obtener cambios empujados al Xaml, coloque el OnNotifyPropertyChanged para IsAgeValid dentro del setter Age en su lugar.

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


Una vez configurada, por supuesto unir el gatillo estilo de falso y verdadero en consecuencia para el resultado 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. 
    } 
} 
+1

Este debería ser la respuesta para este ejemplo específico. Donde sea posible, las propiedades de control que representan la lógica comercial real se deben proporcionar a la vista a través de un ViewModel, no de un "lado de vista". Esto permite que los valores se configuren a través de la configuración/base de datos, etc. –

+0

@TomDeloford Tener la lógica comercial en la máquina virtual también tiene sentido para mí. – OmegaMan

Cuestiones relacionadas