我需要在TabControl上显示所有枚举值作为标签项,除了一个枚举成员(无)
enum MyEnum { Value1, Value2, Value3, None }
TabControl应显示三个选项卡(Value1,Value2和Value3)。我需要能够通过绑定到SelectedItem属性来获取/设置ViewModel中的当前选项卡。每个标签的标题使用本地化的枚举值,目前我使用转换器。
这可能吗?我尝试了很多东西,但无法使它发挥作用。我手动添加每个TabItem都没有问题,但我不确定如何使SelectedItem(tab)成为枚举类型。
答案 0 :(得分:1)
我找到了解决方案。通常你会这样做以获得枚举成员列表:
<ObjectDataProvider x:Key="SomeEnumValues"
MethodName="GetValues"
ObjectType="{x:Type sys:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="vm:SomeEnum" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
这会得到所有成员,所以它不是一个可行的方法。我创建了一个接受枚举值的自定义转换器,并从
类型中提取所有成员// in the convert method
Type type = value.GetType();
List<object> enumValues = new List<object>();
// add each member, except None (has value of 0)
foreach (var field in type.GetFields())
{
if (field.IsLiteral)
{
var x = field.GetValue(null);
// add new value
if ((int)x != 0)
enumValues.Add(field.GetValue(null));
}
}
本地化在ItemTemplate中完成。在那里我也使用转换器(不同的),在那里我得到了本地化的值。
<DataTemplate x:Key="EnumItemTemplate">
<TextBlock Text="{Binding Mode=OneWay, Converter={StaticResource enumConverter}}"/>
</DataTemplate>
答案 1 :(得分:0)
副手,我认为没有办法做你想做的事。 SelectedItem将成为一个TabItem对象,我认为没有办法在这里使用绑定转换器来欺骗它使用枚举。即使你能做到这一点,也没有简单的方法让它神奇地认识到其中一个枚举值是你不想绑定的(即“无”)。
最好的办法是将每个TabItem的Tag属性绑定到所需的枚举,并使用代码来实现所需的选择效果。