此问题的部分内容已在how to bind to an enum as a command parameter上得到解答,但我需要更进一步。
我有一个链接到菜单的数据模板,每个菜单选项都会启动一个具有不同枚举值的命令。我该怎么做呢?我是否需要求助于传递字符串?
public enum TestEnum
{
First,
Second,
Third
}
<DataTemplate>
<MenuItem Header="{Binding Path=.}" Command="{Binding ACommand}"
CommandParameter="{Binding Path=???}" />
</DataTemplate>
我希望第一个MenuItem绑定到Enum.First,第二个绑定到Enum.Second,依此类推。我想写这个,所以我只需要在菜单中编写一次数据模板而不是每个enum.value的菜单项。 HTH。
我需要每个菜单项的命令参数不同。所以我将有3个菜单项,分别是第一,第二和第三。
答案 0 :(得分:10)
不确定我是否正确理解您的要求......这就是您想要的吗?
CommandParameter="{Binding Path={x:Static local:TestEnum.First}}"
编辑:好的,我想我现在明白了......如果你想要枚举值为ItemsSource
,你可以用ObjectDataProvider
来做,但是有一个更好的方法:写一个标记接受枚举类型的扩展并返回值。
标记扩展程序
[MarkupExtensionReturnType(typeof(Array))]
public class EnumValuesExtension : MarkupExtension
{
public EnumValuesExtension()
{
}
public EnumValuesExtension(Type enumType)
{
this.EnumType = enumType;
}
[ConstructorArgument("enumType")]
public Type EnumType { get; set; }
public override object ProvideValue(IServiceProvider serviceProvider)
{
return Enum.GetValues(EnumType);
}
}
<强> XAML 强>
<MenuItem ItemsSource="{my:EnumValues EnumType=my:TestEnum}" Name="menu">
<MenuItem.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Header" Value="{Binding}" />
<Setter Property="Command" Value="{Binding SomeCommand, ElementName=menu}" />
<Setter Property="CommandParameter" Value="{Binding}" />
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>
答案 1 :(得分:5)
如果你想为MenuItem传递一个预定的枚举值(听起来像你这样做),你会这样做......(确保导入{{1}在你的xaml中也是如此)
xmlns:local="..."
您不需要在您要求的实例中为CommandParameter实际绑定任何内容(我认为)。将值绑定到CommandParameter意味着CommandParameter的值可以变化,并且该值的源包含在其他地方,作为另一个元素的DepenedencyProperty上的值或DataContext中的CLR值。</ p>
答案 2 :(得分:1)
<ObjectDataProvider ObjectType="{x:Type sys:Enum}" MethodName="GetValues" x:Key="EnumProvider">
<ObjectDataProvider.MethodParameters>
<x:TypeExtension Type="{x:Type local:TestEnum}" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
<!--Binding the resource as ItemsSource-->
<Menu ItemsSource="{Binding Source={StaticResource EnumProvider}}" />
或
<Menu>
<MenuItem Header="TestEnum" ItemsSource="{Binding Source={StaticResource EnumProvider}}" >
<MenuItem.ItemTemplate>
<DataTemplate>
<MenuItem Header="{Binding Path=.}" Command="{Binding ACommand}"
CommandParameter="{Binding Path=???}" />
</DataTemplate>
</MenuItem.ItemTemplate>
</MenuItem>
</Menu>
答案 3 :(得分:1)
我想将enum绑定为itemsSource,每个菜单项都有一个枚举。
如果您的ItemsSource是enum本身,您只需编写CommandParameter="{Binding}"
即可传递当前的枚举值。