C# 如果该值等于或大于该值,则将工作的WPF触发器

C# 如果该值等于或大于该值,则将工作的WPF触发器,c#,wpf,visual-studio-2010,triggers,C#,Wpf,Visual Studio 2010,Triggers,我用WPF编写了一个应用程序,它有一个按钮和滑块。我想为按钮创建一个触发器,当滑块值大于另一个值时,它会将按钮的“IsEnable”属性设置为false。 现在我有: <Style x:Key="zoomOutButton" TargetType="Button" BasedOn="{StaticResource ResourceKey=buttonStyle}"> <Style.Triggers> <DataTrigger

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

您可以使用转换器实现这一点:

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>

一种更通用的转换器,可用于任何类似类型,可以是:

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。例如,在XAML中,要将int属性“MyIntProperty”与contant 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>

1.

从转换器中返回布尔值的复本并检查它,该死的尼斯:嗨-每当我尝试并实现这一点时,我会得到一个错误:IsEqualOrGreaterThanConverter在Windows演示基金会(WPF)项目中不受支持。我已将该类放置在MainWindow.xaml.cs文件中,但我必须有一些不符合排序的内容。我必须将其更改为此,以避免无效的强制转换错误:Int32.Parse((string)参数)-我想知道这行代码的用途是什么:
publicstatic readonly IValueConverter Instance=new isequalgreaterthanconverter()我以前在查看转换器时没有见过它,仅此而已。