这个问题的一部分已经回答了,关于如何绑定到枚举作为命令参数,但我需要更进一步。
我有一个链接到菜单的数据模板,每个菜单选项都会用不同的枚举值启动一个命令。我该怎么做?我需要仅仅传递一根绳子吗?
public enum TestEnum
{
First,
Second,
Third
}
<DataTemplate>
<MenuItem Header="{Binding Path=.}" Command="{Binding ACommand}"
CommandParameter="{Binding Path=???}" />
</DataTemplate>
我希望第一个MenuItem绑定到Enum。首先,第二个绑定到Enum.second,依此类推。我希望这样写,这样我只需要在Menu中写一次上面的数据模板,而不是为每个Enum.value.HTH写一个菜单项。
我需要每个菜单项的命令参数都不同。所以我会有三个菜单项,第一,第二和第三。
不确定我是否正确理解您的要求。。。这是你想要的吗?
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>
如果你想为MenuItem传递一个预定的枚举值(听起来像你这样做(,你应该这样做…(确保也在xaml中导入xmlns:local="..."
(
<MenuItem ... CommandParameter="{x:Static local:TestEnum.First}" />
在您询问的实例中,您实际上不需要为CommandParameter绑定任何内容(我认为(。将值绑定到CommandParameter意味着CommandParameter的值可以变化,并且该值的源包含在其他地方,可以是另一个元素的DepenedencyProperty上的值,也可以是DataContext中的CLR值。
我想将枚举绑定为itemsSource,每个菜单项都有一个枚举。
如果ItemsSource是枚举本身,那么只需编写CommandParameter="{Binding}"
,它就会传递当前枚举值。
<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>