Триггер WPF, который будет работать, если значение равно или больше - PullRequest
9 голосов
/ 03 февраля 2011

Я написал приложение в WPF, в котором есть кнопка и ползунок. Я хотел бы создать триггер для кнопки, который установил бы для свойства кнопки IsEnable значение false, когда значение ползунка больше , чем другое значение. Прямо сейчас у меня есть:

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

Но я бы хотел установить isEnable не тогда, когда значение CurrentAltitude равно 24000, а когда оно равно или больше 24000. Есть идеи?

Ответы [ 2 ]

14 голосов
/ 03 февраля 2011

Вы можете добиться этого с помощью конвертера:

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

Тогда ваш триггер будет выглядеть так:

<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>
4 голосов
/ 06 января 2016

Более общий конвертер, который можно использовать с любым сопоставимым типом, может быть:

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

Но в этом случае параметр ConverterParameter должен интерпретироваться с тем же типом, что и значение, передаваемое вашему конвертеру. Например, чтобы сравнить свойство int 'MyIntProperty' с постоянным значением int 1 в вашем XAML, вы можете использовать следующий синтаксис:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...