WPF mvvm通过命令发送TreeViewItem的binded元素

时间:2013-02-03 13:38:55

标签: wpf mvvm treeview contextmenu

白天很好。

我在创建ContextMenu TreeView时出现问题。问题很简单。我想在树视图中添加新项目,在treeviewitem上单击RMB并选择上下文菜单命令 我知道我需要将包含父项的参数传递给我的命令。但。我需要人民币点击任何treeviewitem,而不仅仅是选中。
接下来是问题
如何将treeviewitem的绑定数据传递给我的命令。

这是类诊断 enter image description here

这是Xaml(编辑

        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Item.Children}">
                <TextBlock Text="{Binding Item.Code}" HorizontalAlignment="Stretch">
                    <TextBlock.ContextMenu>
                        <ContextMenu Name="MyContextMenu" DataContext="{Binding PlacementTarget,RelativeSource={RelativeSource Self}}">
                            <MenuItem Header="{Binding DataContext.ToString()}" Command="{Binding DataContext.Item.AddNewItemCommand}" CommandParameter="{Binding}"/>
                        </ContextMenu>                            
                    </TextBlock.ContextMenu>
                </TextBlock>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>

但它甚至没有打电话给我。

    private void AddNewItem(object toItem)
    {
        if (toItem == null)
            return;
        ItemViewModel item = toItem as ItemViewModel;
        ItemMaterialModel itemMaterial = new ItemMaterialModel(ItemModel.CreateNewItem());

        ItemMaterialViewModel itemMaterialViewModel = new ItemMaterialViewModel(itemMaterial);
        item.Children.Add(itemMaterialViewModel);
    }

也许我的命令错误的ViewModel?

问候,德米特里。

3 个答案:

答案 0 :(得分:2)

嗨,这只是一种你可以绑定的方式

        <ContextMenu Name="MyContextMenu" DataContext="{Binding PlacementTarget,RelativeSource={RelativeSource Self}}">
                <MenuItem Header="Add" Command="{Binding DataContext.AddNewItemCommand}" CommandParameter="{Binding }"/>
            </ContextMenu>

我希望这会有所帮助。

答案 1 :(得分:2)

感谢ethicallogics和他关于PlacementProperty的信息,我在这里修改了我的Xaml:

        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Item.Children}">
                <TextBlock Text="{Binding Item.Code}" HorizontalAlignment="Stretch">
                    <TextBlock.ContextMenu>
                        <ContextMenu DataContext="{Binding PlacementTarget.DataContext,RelativeSource={RelativeSource Mode=Self}}">
                            <MenuItem 
                                Header="{Binding Item.Code}"
                                Command="{Binding Item.AddNewItemCommand}" 
                                      CommandParameter="{Binding Item}"/>
                        </ContextMenu>                            
                    </TextBlock.ContextMenu>
                </TextBlock>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>

在我的StructureManagerViewModel中,我制作的不是简单的MainItem,而是在树的项目中使用的MainItems的集合。

问候,德米特里 希望这种经历能够帮助人们。

答案 2 :(得分:0)

您可以使用找到的代码here来检测右键单击下的项目(并选择它以获得正面的视觉反馈)。

关注此link,了解由@ethicallogics提供的解决方案中PlacementTarget正在执行的操作。

希望您可以结合使用这两个答案来解决问题。