【发布时间】:2014-03-13 12:50:53
【问题描述】:
我有一个填充组合框的“发票操作”枚举,但我想根据 ViewModel 中的“CanDisplayDetails”属性禁用枚举成员之一(“视图”)。
我不太清楚如何将 IsEnabled 属性绑定到 ComboBoxItem ItemContainerStyle 中的“CanDisplayDetails”,因为上下文似乎是 Enum 而不是我的 ViewModel。如何更正绑定以便它可以提供枚举值,但 IsEnabled 绑定到我的 ViewModel 属性?而且它也只需要影响“视图”ComboBoxItem。谢谢!
到目前为止的风格想法:
<ComboBox.ItemContainerStyle>
<Style TargetType="{x:Type ComboBoxItem}">
<Setter Property="IsEnabled" Value="{Binding CanDisplayDetails}"/>
</Style>
</ComboBox.ItemContainerStyle>
在 XAML 用户控件的资源中:
<ObjectDataProvider x:Key="ActionsEnum" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
<ObjectDataProvider.MethodParameters>
<x:TypeExtension TypeName="Constants:InvoiceActionsLong"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
同一个UserControl中的ComboBox:
<ComboBox Grid.Column="1" ItemsSource="{Binding Source={StaticResource ActionsEnum}}" IsEnabled="{Binding SelectedItem, Converter={StaticResource SelectionConverter}}"
SelectedItem="{Binding SelectedAction}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource EnumDescriptionConverter}}" />
</DataTemplate>
</ComboBox.ItemTemplate>
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding ActionCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
EnumDescriptionConverter:
public class EnumDescriptionConverter : IValueConverter
{
/// <summary>
/// Get enum description
/// </summary>
/// <param name="enumObj"></param>
/// <returns></returns>
private string GetEnumDescription(Enum enumObj)
{
FieldInfo fieldInfo = enumObj.GetType().GetField(enumObj.ToString());
object[] attribArray = fieldInfo.GetCustomAttributes(false);
if (attribArray.Length == 0)
{
return enumObj.ToString();
}
else
{
DescriptionAttribute attrib = attribArray[0] as DescriptionAttribute;
return attrib.Description;
}
}
/// <summary>
/// Returns an enum member's description
/// </summary>
/// <param name="value"></param>
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns></returns>
object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
Enum myEnum = (Enum)value;
string description = GetEnumDescription(myEnum);
return description;
}
object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return string.Empty;
}
}
枚举:
/// <summary>
/// Enum lists all available Actions for Action Combo Box at the Invoice level for DETAIL types ie. active, plan
/// </summary>
public enum InvoiceActionsLong
{
[Description("Contacts")]
Contacts,
[Description("Delivery")]
Delivery,
[Description("Documents")]
Documents,
[Description("Note")]
Note,
[Description("Payments")]
Payments,
[Description("Print")]
Print,
[Description("Process")]
Process,
[Description("Reload")]
Reload,
[Description("Send")]
Send,
[Description("View")]
View
}
我的 ViewModel 中的属性:
/// <summary>
/// Bool denotes whether can display details
/// </summary>
private bool CanDisplayDetails
{
get
{
bool b = true;
if (SelectedItem != null)
{
if (SelectedItem.AdjustmentTypeID == 1)
{
b = false;
}
}
return b;
}
}
【问题讨论】: