2011-04-21 146 views
6

此问题的一部分已在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> 

我希望第一个菜单项绑定到Enum.First,第二个到Enum.Second,等等。我希望这样写,所以我只需要在Menu中为上面的数据模板写入一次,而不是每个enum.value的菜单项。 HTH。

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

+0

什么是您绑定到的ItemsSource? – 2011-04-21 14:48:58

+0

是否要将枚举绑定为菜单的itemssource?并将每个menuItem设置为枚举项? – Howard 2011-04-21 14:49:11

+0

我的ItemsSource是值的列表。我想将枚举绑定为itemsSource与每个具有枚举的菜单项。 – kevindaub 2011-04-21 14:53:56

回答

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

我只是觉得他想要将枚举值绑定为菜单的itemSource。 – Howard 2011-04-21 15:20:50

+0

我认为你的答案是接近的,除非我必须猜测,我会说daub815打算为每个MenuItems传递一个预定的枚举值。 – 2011-04-21 19:42:15

+0

我想在整个枚举中传递一个itemsource,并将命令参数设置为枚举中的每个枚举。 – kevindaub 2011-04-21 22:07:06

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> 
1

欲枚举作为结合的ItemsSource与具有枚举每个菜单项。

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

5

如果你想传递一个预定枚举值(这听起来像你这样做)的菜单项,你会像这样做...(确保在你的xaml中输入xmlns:local="..."

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

你并不需要真正绑定到任何东西的情况下的CommandParameter你问(我认为)。结合一个值到CommandParameter意味着CommandParameter的值可以用作其它元素的DepenedencyProperty一个值或一个DataContext内的CLR值变化,并且该值的源被包含在其他地方。