2011-02-03 11 views
8

Ho scritto un'applicazione in WPF con un pulsante e un dispositivo di scorrimento. Vorrei creare un trigger per il pulsante, che imposterebbe la proprietà 'IsEnable' del pulsante su false quando il valore del cursore è maggiore di rispetto a un altro valore. In questo momento ho:Trigger WPF che funzionerebbe se il valore è uguale o superiore

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

ma vorrei impostare isEnable non quando il valore di CurrentAltitude uguale 24000, ma quando si è uguale o superiore a 24000. Tutte le idee?

+0

possibile duplicato del [WPF trigger quando il valore della proprietà è maggiore di una certa quantità] (http://stackoverflow.com/questions/1094401/wpf-trigger-when-property-value-is-greater-than-a-certain-amount) – pogosama

risposta

13

È possibile ottenere questo utilizzando un convertitore:

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

Poi il trigger sarà simile a questa:

<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

restituendo Boolean dal convertitore e controllalo, dannazione :) – mkb

1

un convertitore più generico, utilizzabile con qualsiasi tipo comparabili, potrebbe essere:

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

Ma in questo caso, ConverterParameter deve essere interpretato con lo stesso tipo del valore tr inviato al tuo convertitore. Ad esempio, per confrontare una proprietà int 'MyIntProperty' con il valore contant int 1, in XAML, è possibile utilizzare la seguente sintassi:

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

Problemi correlati