2013-05-01 73 views
0

如果Order的状态为OrderStatus.NewOrderStatus.Ordered,我有一个TextBox,我想启用它。这是别的,TextBox应该保持禁用状态。根据枚举值启用TextBox

<TextBox Text="{Binding OrderedAmount}" IsEnabled="True"/> 

我想我需要使用某种MultiBinding,但似乎无法找到如何做,在这种特殊情况下适当的资源。

+0

只需结合'IsEnabled'到'OrderStatus'和使用转换器返回TRUE;或'FALSE'根据枚举值是什么。 – 2013-05-01 15:16:27

+1

嗨,你可以创建一个'style',使用'DataTrigger'来设置'textbox'的值。看看这个线程; http://stackoverflow.com/questions/6211264/why-cant-i-use-a-datatrigger-to-set-textbox-isenabled-true希望它有帮助! – 2013-05-01 15:17:40

回答

6

您应该使用这个ValueConverter:

public class IsNewOrOrderedConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     OrderStatus status = (OrderStatus)value; 
     return status == OrderStatus.New || status == OrderStatus.Ordered; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

然后在你的XAML中使用它作为转换器:

<TextBox Text="{Binding OrderedAmount}" 
      IsEnabled="{Binding OrderStatus, Converter={StaticResource IsNewOrOrderedConverter}"/> 

不要忘了申报资源:

<App.Resources> 
    <myPrefix:IsNewOrOrderedConverter x:Key="IsNewOrOrderedConverter" /> 
</App.Resources> 

http://msdn.microsoft.com/en-us/library/ms750613.aspx关于申报资源。

参数化

单个转换器可以由参数化,因此它可以为不同类型的顺序被重新使用。 的XAML会是这样的:

 <local:OrderStatusToBooleanConverter 
       StatusList="New,Ordered" x:Key="NewOrOrderedConverter" /> 
     <local:OrderStatusToBooleanConverter 
       StatusList="Delivered" x:Key="DeliveredConverter" /> 

这需要一些特殊的战术,因为没有办法在默认情况下,使其可读(用逗号分隔的枚举值)。这就是我们需要一种类型的转换器:

public class StringToOrderStatusArrayConverter : TypeConverter 
{ 
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
    { 
     return sourceType == typeof(string); 
    } 
    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) 
    { 
     if (value == null) 
     { 
      return new OrderStatus[0]; 
     } 
     else 
     { 
      return (from s in value.ToString().Split(',') 
        select Enum.Parse(typeof(OrderStatus), s)) 
        .OfType<OrderStatus>() 
        .ToArray<OrderStatus>(); 

     } 
    } 
} 

的类型转换器由逗号分隔成一个数组枚举值的输入串数组转换。

这个阵列然后可以送入ValueConverter

public class OrderStatusToBooleanConverter : IValueConverter 
{ 
    [TypeConverter(typeof(StringToOrderStatusArrayConverter))] 
    public OrderStatus[] StatusList { get; set; } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     OrderStatus status = (OrderStatus)value; 
     return StatusList != null && StatusList.Contains(status); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

优秀的答案!如果我有一个名为DeliveredAmount的另一个TextBox,它与其他方式类似,但应在OrderStatus交付时启用,是否需要创建另一个Converter或可以以某种方式检查Converter内部的问题字段?即Converter是否知道它正在转换哪个字段? – 2013-05-01 16:02:17

+1

@TatuUlmanen它需要一个新的转换器,因为转换器只知道它给出的值,而不知道它是什么,并且不会有办法区分新订单和交货订单。 – 2013-05-01 17:02:17

+1

@TatuUlmanen我已经更新了我的答案,包括使用参数,但是这有点复杂。 – Bas 2013-05-02 07:14:20