在没有Tag的DataTemplate中为MenuItem绑定命令

时间:2011-01-22 17:05:23

标签: wpf command datatemplate

我想将ViewModel中的命令绑定到DataTemplate中的menuItem。我可以使用Tag来做到这一点。是否有任何方法可以执行相同的任务但不使用标记。

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

我的ViewModel

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

3 个答案:

答案 0 :(得分:0)

您可以尝试将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已关闭,所以此时无法检查。

答案 1 :(得分:0)

根据您当前的设计,您需要从ContextMenuStackPanel并返回到包含DataContext的{​​{1}}。是什么让这个尴尬的是ListBox的{​​{1}}已经缩小到特定的学生。

至少有两种方法可以让这更容易:

  • DataContext中提供StackPanel属性,以便命令就在您需要的地方
  • TriggerCommand中提供Student属性以逃避缩小的范围

答案 2 :(得分:0)

一种方法是在viewmodel中定义上下文菜单集合表示,其中包含标题字符串和命令操作(可能带有谓词)。

viewmodel创建一个可观察的contextmenu项集合,视图将其绑定到ContextMenu itemssource,并将displaymember路径设置为header string。