将枚举值作为命令参数传递

时间:2011-04-21 14:40:53

标签: .net wpf xaml enums enumeration

此问题的部分内容已在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个菜单项,分别是第一,第二和第三。

4 个答案:

答案 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}"即可传递当前的枚举值。