根据枚举值启用TextBox

Tat*_*nen 0 wpf enums binding

我有我想启用如果一个TextBox Order的状态会显示为OrderStatus.NewOrderStatus.Ordered.它是另一回事,TextBox应该保持禁用状态.

<TextBox Text="{Binding OrderedAmount}" IsEnabled="True"/>
Run Code Online (Sandbox Code Playgroud)

我假设我需要使用某种MultiBinding,但似乎无法在这种特殊情况下找到合适的资源.

Bas*_*Bas 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将它用作xaml中的转换器:

<TextBox Text="{Binding OrderedAmount}" 
          IsEnabled="{Binding OrderStatus, Converter={StaticResource IsNewOrOrderedConverter}"/>
Run Code Online (Sandbox Code Playgroud)

不要忘记申报资源:

 <App.Resources>
    <myPrefix:IsNewOrOrderedConverter x:Key="IsNewOrOrderedConverter" />
 </App.Resources>
Run Code Online (Sandbox Code Playgroud)

关于声明资源的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" />
Run Code Online (Sandbox Code Playgroud)

这需要一些特殊的策略,因为默认情况下没有办法让它可读(枚举值用逗号分隔).这就是我们需要类型转换器的地方:

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

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

类型转换器将由逗号分隔的枚举值的输入字符串数组转换为数组.

然后可以将此数组输入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();
    }
}
Run Code Online (Sandbox Code Playgroud)