如果Order
的状态为OrderStatus.New
或OrderStatus.Ordered
,我有一个TextBox,我想启用它。这是别的,TextBox应该保持禁用状态。根据枚举值启用TextBox
<TextBox Text="{Binding OrderedAmount}" IsEnabled="True"/>
我想我需要使用某种MultiBinding,但似乎无法找到如何做,在这种特殊情况下适当的资源。
如果Order
的状态为OrderStatus.New
或OrderStatus.Ordered
,我有一个TextBox,我想启用它。这是别的,TextBox应该保持禁用状态。根据枚举值启用TextBox
<TextBox Text="{Binding OrderedAmount}" IsEnabled="True"/>
我想我需要使用某种MultiBinding,但似乎无法找到如何做,在这种特殊情况下适当的资源。
您应该使用这个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();
}
}
优秀的答案!如果我有一个名为DeliveredAmount的另一个TextBox,它与其他方式类似,但应在OrderStatus交付时启用,是否需要创建另一个Converter或可以以某种方式检查Converter内部的问题字段?即Converter是否知道它正在转换哪个字段? – 2013-05-01 16:02:17
@TatuUlmanen它需要一个新的转换器,因为转换器只知道它给出的值,而不知道它是什么,并且不会有办法区分新订单和交货订单。 – 2013-05-01 17:02:17
@TatuUlmanen我已经更新了我的答案,包括使用参数,但是这有点复杂。 – Bas 2013-05-02 07:14:20
只需结合'IsEnabled'到'OrderStatus'和使用转换器返回TRUE;或'FALSE'根据枚举值是什么。 – 2013-05-01 15:16:27
嗨,你可以创建一个'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