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



这个问题的一部分已经回答了,关于如何绑定到枚举作为命令参数,但我需要更进一步。

我有一个链接到菜单的数据模板,每个菜单选项都会用不同的枚举值启动一个命令。我该怎么做?我需要仅仅传递一根绳子吗?

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>

相关内容

  • 没有找到相关文章

最新更新