Укажите команду для MenuItem в шаблоне данных - PullRequest
19 голосов
/ 22 мая 2009

У меня есть контекстное меню. Он привязан к некоторой коллекции и имеет определенный ItemTemplate, подобный этому:

<ContextMenu
    ItemsSource={Binding ...}
    ItemTemplate={StaticResource itemTemplate}
    />

itemTemplate - это простой DataTemplate с TextBlock:

<DataTemplate x:Key="itemTemplate">
    <TextBlock Text={Binding ...} />
</DataTemplate>

Как связать свойство Command для MenuItem со свойством базового объекта?

Ответы [ 2 ]

24 голосов
/ 22 мая 2009

Я думаю, вам нужно обернуть ваш TextBlock в MenuItem:

<DataTemplate x:Key="itemTemplate">
    <MenuItem Command={Binding ...}>
        <TextBlock Text={Binding ...} />
    </MenuItem>
</DataTemplate>

Но сейчас у меня нет IDE, чтобы попробовать это. Дайте мне знать, как это происходит.


Похоже, вам нужно использовать ItemContainerStyle, как показано здесь . Извините за то, что вы ввели вас по неверному пути с самого начала, но я оказался перед IDE, и это работает:

<ContextMenu.ItemContainerStyle>
    <Style TargetType="MenuItem">
        <Setter Property="Command" Value="{Binding ...}"/>
    </Style>
</ContextMenu.ItemContainerStyle>
6 голосов
/ 04 мая 2012

Хотя это лишь небольшая разница в ответе Мартина Харриса, я все равно решил поделиться им. Я нашел более полезным указать одну команду для всей коллекции, а также отправить вместе с CommandParameter:

<MenuItem.ItemContainerStyle>
    <Style TargetType="MenuItem">
       <Setter Property="Command" Value="{x:Static v:ViewModel.CommandForAll}"/>
       <Setter Property="CommandParameter" Value="{Binding ValueForCommand}"/>
    </Style>
</MenuItem.ItemContainerStyle>

Затем вы можете определить, что делать в обработчике для команды:

private void CommandForAll_Executed(object sender, ExecutedRoutedEventArgs e)
{
    var cmdParam = e.Paramater as ExpectedType
    if (cmdParam != null)
        //DoStuff...
}
...