如果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