Передача значения Enum в качестве параметра команды - PullRequest
6 голосов
/ 21 апреля 2011

На часть этого вопроса дан ответ на , как связать перечисление в качестве параметра команды , но мне нужно пойти еще дальше.

У меня есть шаблон данных, который связываетв меню, и каждый пункт меню инициирует команду с различным значением перечисления.Как мне это сделать?Нужно ли прибегать к простой передаче строки?

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 ]

10 голосов
/ 21 апреля 2011

Не уверен, что правильно понимаю ваше требование ... это то, что вы хотите?

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>
5 голосов
/ 21 апреля 2011

Если вы хотите передать предопределенное значение Enum (что звучит так же, как вы) для MenuItem, вы должны сделать это так ... (убедитесь, что импортировали xmlns:local="..." вxaml также)

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

Вам не нужно на самом деле привязывать что-либо к CommandParameter в экземпляре, который вы запрашиваете (я думаю).Привязка значения к CommandParameter подразумевает, что значение CommandParameter может изменяться, и источник этого значения содержится где-то еще, либо в качестве значения в DepenedencyProperty другого элемента, либо в качестве значения CLR в DataContext.

1 голос
/ 21 апреля 2011

Я хочу связать перечисление в качестве источника элементов с каждым элементом меню, имеющим перечисление.

Если вашим ItemsSource является само перечисление, вы можете просто написать CommandParameter="{Binding}" и оно передаст текущее значение перечисления.

1 голос
/ 21 апреля 2011
<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>
...