WPF触发器:如果值相等或大于,则会起作用

12

我在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时。你有什么想法吗?


可能是重复的问题:WPF触发器当属性值大于某个值时 - pogosama
2个回答

17

你可以使用转换器来实现此目的:

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>

从转换器返回布尔值并检查,非常好 :) - mkb
嗨 - 每次我尝试实现这个功能时,都会出现错误:IsEqualOrGreaterThanConverter在Windows Presentation Foundation(WPF)项目中不受支持。我已经将该类放置在MainWindow.xaml.cs文件中,但我肯定有些东西不对劲。 - Kasey
我不得不将其更改为这样以避免无效的转换错误:Int32.Parse((string) parameter); - dvdhns
2
我很感兴趣了解这行代码的目的是什么: public static readonly IValueConverter Instance = new IsEqualOrGreaterThanConverter();在查看转换器时,我之前没有见过它。 - Pete

4
一个更通用的转换器,可用于任何可比较的类型,可以是:

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必须与传递给您的Converter的值具有相同的类型。例如,在XAML中将int属性'MyIntProperty'与常量int值1进行比较,您可以使用以下语法:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接