2011-02-03 16 views
8

Escribí una aplicación en WPF que tiene un botón y control deslizante. Me gustaría crear un disparador para el botón, que establecería la propiedad 'IsEnable' del botón en falso cuando el valor del control deslizante sea mayor que en otro valor. Ahora mismo tengo:WPF Disparador que funcionaría si el valor es igual o mayor

<Style x:Key="zoomOutButton" TargetType="Button" BasedOn="{StaticResource ResourceKey=buttonStyle}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding CurrentAltitude}" Value="24000"> 
       <Setter Property="IsEnabled" Value="False" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

Pero me gustaría establecer isEnable no cuando el valor de CurrentAltitude igual a 24000, pero cuando es igual o mayor que 24000. ¿Alguna idea?

+0

posible duplicado de [WPF gatillo cuando el valor de la propiedad es mayor que una cierta cantidad] (http://stackoverflow.com/questions/1094401/wpf-trigger-when-property-value-is-greater-than-a-certain-amount) – pogosama

Respuesta

13

Esto se puede conseguir utilizando un convertidor:

public class IsEqualOrGreaterThanConverter : IValueConverter { 
    public static readonly IValueConverter Instance = new IsEqualOrGreaterThanConverter(); 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { 
     int intValue = (int) value; 
     int compareToValue = (int) parameter; 

     return intValue >= compareToValue; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { 
     throw new NotImplementedException(); 
    } 
} 

A continuación, el gatillo se verá así:

<Style x:Key="zoomOutButton" TargetType="Button" BasedOn="{StaticResource ResourceKey=buttonStyle}"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding CurrentAltitude, Converter={x:Static my:IsEqualOrGreaterThanConverter.Instance}, ConverterParameter=24000}" Value="True"> 
      <Setter Property="IsEnabled" Value="False" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 
+0

devolviendo Boolean desde Converter y verifícalo, malditamente bien :) – mkb

1

Un convertidor más genérico, se puede utilizar con cualquier tipo comparable, podría ser:

public class IsGreaterOrEqualThanConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     IComparable v = value as IComparable; 
     IComparable p = parameter as IComparable; 

     if (v == null || p == null) 
      throw new FormatException("to use this converter, value and parameter shall inherit from IComparable"); 

     return (v.CompareTo(p) >= 0); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Pero en este caso, el parámetro Convertidor debe interpretarse con el mismo tipo que el valor tr emitido a su convertidor. Por ejemplo, para comparar una propiedad int 'MyIntProperty' con el valor contant int 1, en el XAML, puede utilizar esta sintaxis:

<UserControl x:Class="MyNamespace.MyControl" 
      xmlns:sys="clr-namespace:System;assembly=mscorlib" 
      xmlns:genconverters="clr-namespace:MyConverterNamespace;assembly=MyConvertersAssembly"> 

    <Grid> 
     <Grid.Resources> 
      <genconverters:IsGreaterOrEqualThanConverter x:Key="IsEqualOrGreaterThanConverter"/> 
      <sys:Int32 x:Key="Int1">1</sys:Int32> 
     </Grid.Resources> 
     <ComboBox IsEnabled="{Binding MyIntProperty, 
           Converter={StaticResource IsEqualOrGreaterThanConverter}, 
           ConverterParameter={StaticResource Int1}}" 
        ItemsSource="{Binding Items}" 
        SelectedItem="{Binding SelectedItem}"/> 
    </Grid> 

Cuestiones relacionadas