我想将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 { ... }
}
答案 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)
根据您当前的设计,您需要从ContextMenu
到StackPanel
并返回到包含DataContext
的{{1}}。是什么让这个尴尬的是ListBox
的{{1}}已经缩小到特定的学生。
至少有两种方法可以让这更容易:
DataContext
中提供StackPanel
属性,以便命令就在您需要的地方TriggerCommand
中提供Student
属性以逃避缩小的范围答案 2 :(得分:0)
一种方法是在viewmodel中定义上下文菜单集合表示,其中包含标题字符串和命令操作(可能带有谓词)。
viewmodel创建一个可观察的contextmenu项集合,视图将其绑定到ContextMenu itemssource,并将displaymember路径设置为header string。