Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WPF Trigger that would work if the value is equal or greater

I wrote an application in WPF that has a button and slider. I would like to create a trigger for the button, which would set the button's 'IsEnable' property to false when the slider value is greater than another value. Right now I have:

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

But I would like to set isEnable not when the value of CurrentAltitude equal 24000, but when it is equal or greater than 24000. Any ideas?

like image 888
ravenik Avatar asked Feb 03 '11 13:02

ravenik


2 Answers

You can achieve this using a converter:

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

Then your trigger will look like this:

<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>
like image 63
Pavlo Glazkov Avatar answered Nov 15 '22 22:11

Pavlo Glazkov


A more generic converter, usable with any comparable type, could be :

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

But in this case, the ConverterParameter must be interpreted with the same type as the value transmitted to your Converter. For example, to compare an int property 'MyIntProperty' with the contant int value 1, in your XAML, you can use this syntax :

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

like image 20
La Ponse Avatar answered Nov 15 '22 22:11

La Ponse