【问题标题】:Binding Context menu to ViewModel which is not in context's Visuals tree将上下文菜单绑定到不在上下文视觉树中的 ViewModel
【发布时间】:2013-09-23 12:48:35
【问题描述】:

我有一个 TreeView,它的 itemsource 是我的 Model 类的集合。我在 treeView 上添加了一个上下文菜单。由于 contextMenu 的命令应该在可视化树中,所以我不得不将它们放在我的 Model 类中。哪个是错误的(将目录绑定到模型)。

如何将上下文菜单的命令绑定到我的 ViewModel 而不是模型?

这是我的 TreeView 的 XAML 代码。

 <TreeView ItemsSource="{Binding DigSource}" Tag="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}">
                    <TreeView.ItemContainerStyle >
                        <Style TargetType="{x:Type TreeViewItem}">
                            <Setter Property="ContextMenu">
                                <Setter.Value>
                                    <ContextMenu >
                                        <MenuItem Header="Edit" CommandParameter="{Binding }"
                                            Command="{Binding Path=PlacementTarget.Tag.DataContext.MyCommand, 
                                            RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}" />
                                    </ContextMenu>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </TreeView.ItemContainerStyle >
                    <TreeView.ItemTemplate>
                        <HierarchicalDataTemplate ItemsSource="{Binding SingleDig}">
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="{Binding Name}"/>
                            </StackPanel>
                            <HierarchicalDataTemplate.ItemTemplate>
                                <DataTemplate DataType="{x:Type dt:MultiDig}">
                                    <StackPanel Orientation="Horizontal">
                                        <TextBlock Text="{Binding Name}"/>
                                    </StackPanel>
                                </DataTemplate>
                            </HierarchicalDataTemplate.ItemTemplate>
                        </HierarchicalDataTemplate>
                    </TreeView.ItemTemplate>
                </TreeView>

ViewModel 的 Icommand 属性是

    private ICommand _editMenuCommand;
    /// <summary>
    /// Edit command
    /// </summary>
    public ICommand EditMenuCommand { get { return _editMenuCommand ?? (_editMenuCommand = new RelayCommand(EditMenu)); } }

    /// <summary>
    /// Edit menu
    /// </summary>
    public void EditMenu()
    {
        MessageBox.Show("Edit me");
    }

提前致谢。

【问题讨论】:

  • 这段代码有什么问题?命令没有触发?

标签: wpf xaml binding treeview contextmenu


【解决方案1】:

这是您的 ItemContainerStyle 与更新的绑定。在我的最后进行了测试,效果很好。

<TreeView ItemsSource="{Binding DigSource}">
    <TreeView.ItemContainerStyle >
          <Style TargetType="{x:Type TreeViewItem}">
               <Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}"/>
               <Setter Property="ContextMenu">
                   <Setter.Value>
                       <ContextMenu >
                            <MenuItem Header="Edit" CommandParameter="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}"
                                                Command="{Binding Path=PlacementTarget.Tag.DataContext.MyCommand, 
                                                RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}" />
                         </ContextMenu>
                    </Setter.Value>
                  </Setter>
         </Style>
   </TreeView.ItemContainerStyle >

【讨论】:

  • 问题是我不知道它是调用命令的父项还是子项。我只有两个层次结构。一个 Parent 可以有多个孩子,并且可以有 b n 个 parent 项目。所以我需要知道哪个项目,上下文菜单的命令被调用。
  • 昨天你说“在命令参数中发送项目,如 Binding=PlacementTarget.DataContext”,我做到了,但我不知道如何在我的 viewModel 中接收项目
  • 是的..我上面提供的答案也一样..现在我们在树视图项上有上下文菜单..它可以是任何树视图项(父或子),并且将是上下文菜单的 PlacementTarget.. . 所以当我们说 PlacementTarget.DataContext 它意味着模型支持树视图项.. 这就是为什么你在命令参数中得到它
  • 我明白了。但是一次,它要么是父项的命令执行,要么是子项的命令。我怎么知道是哪一个?
  • 你有不同类型的父母和孩子rt?因此,通过您在命令参数中获得的项目类型,您可以确定它是子项还是父项
猜你喜欢
  • 1970-01-01
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-05
相关资源
最近更新 更多