Команда привязки для MenuItem в DataTemplate без тега - PullRequest
1 голос
/ 22 января 2011

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

<Window.Resources>
    <DataTemplate x:Key="StudentListBoxItemTemplate">
        <StackPanel Tag="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}">
            <TextBlock Text="{Binding Name}"/>
            <StackPanel.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="Trigger" Command="{Binding PlacementTarget.Tag.TriggerCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>
                </ContextMenu>
            </StackPanel.ContextMenu>
        </StackPanel>
    </DataTemplate>
</Window.Resources>
<StackPanel>
    <ListBox 
        ItemsSource="{Binding StudentList}" 
        ItemTemplate="{StaticResource StudentListBoxItemTemplate}">
    </ListBox>
</StackPanel>

My ViewModel

public class MainViewModel {
    public ICommand TriggerCommand { ... }
    public ObservableList<Student> StudentList { ... }
}

Ответы [ 3 ]

0 голосов
/ 22 января 2011

При вашем текущем дизайне вам нужно пройти от ContextMenu до StackPanel и вернуться к DataContext содержащего ListBox.Что делает это неловким, так это то, что DataContext из StackPanel уже сужено для конкретного студента.

Есть как минимум два способа сделать это проще:Укажите свойство TriggerCommand в Student, чтобы команда была там, где вам нужно

Укажите свойство Parent в Student, чтобы избежать суженной области действия
0 голосов
/ 22 января 2011

Один из способов - получить представление коллекции контекстного меню, определенное в вашей модели представления, которая будет содержать строку заголовка и действие команды (возможно, с предикатом).

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

0 голосов
/ 22 января 2011

Вы можете попытаться добавить событие click в menuItem, как показано ниже

<Menu Style="{StaticResource bellRingersFontStyle}" Height="23" Name="menu1" Width="Auto" DockPanel.Dock="Top" VerticalAlignment="Top">
            <MenuItem Header="_File">
                <MenuItem Header="_New Member" Name="newMember" Click="newMember_Click" >
                    <MenuItem.Icon>
                        <Image Source="Face.bmp" />
                    </MenuItem.Icon>
                </MenuItem>
                <MenuItem Header="_Save Member Details" Name="saveMember" IsEnabled="False" Click="saveMember_Click">
                    <MenuItem.Icon>
                        <Image Source="Note.bmp" />
                    </MenuItem.Icon>
                </MenuItem>
                <Separator />
                <MenuItem Header="E_xit" Name="exit" Click="exit_Click"  />
            </MenuItem>
            <MenuItem Header="_Help">
                <MenuItem Header="_About Middleshire Bell Ringers" Name="about" Click="about_Click" >
                    <MenuItem.Icon>
                        <Image Source="Ring.bmp" />
                    </MenuItem.Icon>
                </MenuItem>
            </MenuItem>
        </Menu>

Попробуйте связать команду с Click .Мой VS не работает, поэтому не могу проверить в данный момент.

...