Передача значения Enum как параметра команды

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

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

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 пункта меню: первый, второй и третий.


person kevindaub    schedule 21.04.2011    source источник
comment
К какому элементу ItemsSource вы привязываетесь?   -  person H.B.    schedule 21.04.2011
comment
Вы хотите привязать перечисление как источник элементов для меню? И установить каждый элемент меню как элемент перечисления?   -  person Howard    schedule 21.04.2011
comment
My ItemsSource - это список значений. Я хочу связать перечисление как itemsSource с каждым элементом меню, имеющим перечисление.   -  person kevindaub    schedule 21.04.2011


Ответы (3)


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

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>
person Thomas Levesque    schedule 21.04.2011
comment
Я просто думаю, что он хочет привязать значения перечисления как источник элементов меню. - person Howard; 21.04.2011
comment
Я думаю, ваш ответ близок, за исключением того, что если бы мне пришлось угадывать, я бы сказал, что daub815 намеревается передать заранее определенное значение перечисления для каждого из его MenuItems. - person myermian; 21.04.2011
comment
Я хочу передать все перечисление в качестве источника элементов, и параметр команды будет установлен для каждого перечисления в перечислении. - person kevindaub; 22.04.2011
comment
Примечание: {x: Static local: TestEnum.First} ‹- это работает во время выполнения и в конструкторе VS, но не работает в Blend 4. - person Jack Ukleja; 07.10.2011

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

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

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

person myermian    schedule 21.04.2011

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

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

person H.B.    schedule 21.04.2011