如果Order
的状态为OrderStatus.New
或OrderStatus.Ordered
,我想要启用一个TextBox。它是另一回事,TextBox应该保持禁用状态。
<TextBox Text="{Binding OrderedAmount}" IsEnabled="True"/>
我假设我需要使用某种MultiBinding,但似乎无法在这种特殊情况下找到合适的资源来解决这个问题。
答案 0 :(得分: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();
}
}