【问题标题】:Bind Command for MenuItem in DataTemplate without Tag无标签的 DataTemplate 中 MenuItem 的绑定命令
【发布时间】:2011-01-22 17:05:23
【问题描述】:

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

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

我的视图模型

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

【问题讨论】:

    标签: wpf command datatemplate


    【解决方案1】:

    使用您当前的设计,您需要从ContextMenuStackPanel 并返回到包含ListBoxDataContext。造成这种尴尬的是StackPanelDataContext 已经缩小到特定的学生。

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

    • Student 中提供TriggerCommand 属性,这样命令就在您需要的地方
    • Student 中提供Parent 属性以避开缩小的范围

    【讨论】:

      【解决方案2】:

      您可以尝试向 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 已关闭,因此目前无法检查。

      【讨论】:

      • 我想把逻辑放在 ViewModel 上,而不是后面的代码。所以我使用 Command 而不是 Click。
      • 为什么不尝试在 Window.Resources 中包含 ViewModel,然后尝试将命令绑定到 MenuItem。顺便说一句,我不太确定。但到目前为止对我来说似乎是合乎逻辑的
      【解决方案3】:

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

      视图模型创建上下文菜单项的可观察集合,视图将其绑定到上下文菜单项源并将显示成员路径设置为标题字符串。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-28
        • 2017-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-22
        相关资源
        最近更新 更多