【问题标题】:Passing Enum Value as a Command Parameter将枚举值作为命令参数传递
【发布时间】:2011-04-21 14:40:53
【问题描述】:

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。

我需要每个菜单项的命令参数不同。所以我会有第一、二、三三个菜单项。

【问题讨论】:

  • 你绑定的 ItemsSource 是什么?
  • 您想将枚举绑定为菜单的 itemssource 吗?并将每个 menuItem 设置为枚举项?
  • My ItemsSource 是一个值列表。我想将枚举绑定为 itemsSource,每个菜单项都有一个枚举。

标签: .net wpf xaml enums enumeration


【解决方案1】:

不确定我是否正确理解您的要求...这是您想要的吗?

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>

【讨论】:

  • 我只是觉得他想将枚举值绑定为菜单的 itemssource。
  • 我认为你的答案很接近,除非我不得不猜测,否则我会说 daub815 打算为他的每个 MenuItems 传递一个预定的枚举值。
  • 我想把整个枚举作为一个itemsource传入,命令参数会设置到枚举中的每个枚举。
  • 注意:{x:Static local:TestEnum.First}
【解决方案2】:

如果你想为 MenuItem 传递一个 predetermined 枚举值(听起来像你这样做),你会这样做......(确保将 xmlns:local="..." 导入你的xml也是)

<MenuItem ... CommandParameter="{x:Static local:TestEnum.First}" />

在您询问的实例中,您实际上不需要为 CommandParameter 绑定任何东西(我认为)。将值绑定到 CommandParameter 意味着 CommandParameter 的值可以变化,并且该值的来源包含在其他位置,可以是另一个元素的 DependedencyProperty 上的值,也可以是 DataContext 中的 CLR 值。

【讨论】:

    【解决方案3】:

    我想将枚举绑定为 itemsSource,每个菜单项都有一个枚举。

    如果您的 ItemsSource 是枚举本身,您可以只写CommandParameter="{Binding}",它将传递当前的枚举值。

    【讨论】:

      【解决方案4】:
      <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>
      

      【讨论】:

        猜你喜欢
        • 2010-09-26
        • 2012-08-04
        • 1970-01-01
        • 2012-07-31
        • 2012-04-18
        • 1970-01-01
        • 2011-04-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多