2011-02-03 87 views
8

我在WPF中编写了一个具有按钮和滑块的应用程序。我想为该按钮创建一个触发器,当滑块值为大于时,该按钮的按钮的“IsEnable”属性设置为false。 现在我有:如果值相等或更大,WPF触发器将工作

<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 任何想法?

+0

可能重复时属性值大于一定数量](http://stackoverflow.com/questions/1094401/wpf-trigger-when-property-value-is-greater-than-a-certain-amount) – pogosama 2015-01-21 15:32:32

回答

13

你可以做到这一点使用转换器:

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

从转换器返回布尔值并检查它,该死的不错:) – mkb 2015-10-20 10:50:23

1

一个更通用的转换器,与任何可比类型可用,可能是:

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必须被解释为与值tr相同的类型向您的转换器提交。例如,与含量的不同int值1一个int属性“MyIntProperty”相比,在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> 

[WPF触发的