Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Caliburn.micro get treeview';单击上下文菜单上的选定项_C#_Wpf_Treeview_Contextmenu_Caliburn.micro - Fatal编程技术网

C# Caliburn.micro get treeview';单击上下文菜单上的选定项

C# Caliburn.micro get treeview';单击上下文菜单上的选定项,c#,wpf,treeview,contextmenu,caliburn.micro,C#,Wpf,Treeview,Contextmenu,Caliburn.micro,我的任务是在treeview中使用contextmenu,并通过单击contextmenu元素将选定的treeview项传递给ViewModel 这是我的xaml: <Window.Resources> <HierarchicalDataTemplate x:Key="Ufps" <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Id}"

我的任务是在treeview中使用contextmenu,并通过单击contextmenu元素将选定的treeview项传递给ViewModel

这是我的xaml:

<Window.Resources>
  <HierarchicalDataTemplate x:Key="Ufps"
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding Id}" />
            <TextBlock Margin="5 0 0 0" Text="{Binding Name}" />
        </StackPanel>
  </HierarchicalDataTemplate>
</Window.Resources>
........
........
<TreeView x:Name="TrvUfpsDictionary" Height="222" Canvas.Left="25" 
  Canvas.Top="280" Width="545"
  Background="AliceBlue" 
  ItemsSource="{Binding Path=Ufps, Mode=OneWay}" 
  ItemTemplate="{StaticResource Ufps}">
        <TreeView.ContextMenu>
          <ContextMenu>
            <MenuItem Header="Add Element"
             cal:Message.Attach="[Event Click] = [Action AddElement(TrvUfpsDictionary.SelectedItem)]"
                />
                ................
            </ContextMenu>
        </TreeView.ContextMenu>           
    </TreeView>
........
<Button Content="Test" Canvas.Left="475" Canvas.Top="568" Width="75"
 cal:Message.Attach="[Event Click] = [Action AddElement(TrvUfpsDictionary.SelectedItem)]"/>
现在我已经坚持了。当我选择treeview的项目,然后按下“测试”按钮时,它工作正常,它会将所选项目传递到我虚拟机中的“AddElement”。但是当我对contextmenu做同样的操作时,它总是传递null。我错过什么了吗

编辑
我制作了一个简单的应用程序,上面描述了这个问题

您可能需要将上下文菜单进一步移动到树状视图、项目模板中,并将上下文菜单添加到节点中的标签/文本块中

例如,考虑下面的雇员树(由于我不知道您的数据结构而进行仿真),

下面这行代码确保了绑定正确(到ViewModel)
TestControl
是用户控件的x:Name

cal:Action.TargetWithoutContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}"
最后,单击操作将修改如下

cal:Message.Attach="[Event Click] = [Action AddElement($datacontext)]"
这将确保在传递正确参数的情况下调用ViewModel的操作

更新

<HierarchicalDataTemplate DataType="Node"
                                  ItemsSource="{Binding XPath=./*}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Margin="0"
                           Text="Node:" />
                <TextBlock Margin="5,0,0,0"  Tag="{Binding DataContext, ElementName=TestControl}"
                           Text="{Binding XPath=@name}" >
                    <TextBlock.ContextMenu>
                        <ContextMenu
                            cal:Action.TargetWithoutContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
                            <MenuItem Header="Add Element" cal:Message.Attach="[Event Click] = [Action AddElement($datacontext)]" />
                        </ContextMenu>
                    </TextBlock.ContextMenu>
                </TextBlock>
            </StackPanel>
        </HierarchicalDataTemplate>
根据您的评论和代码,以下是所需的更改

窗口定义:添加x:Name

<Window
        x:Class="WpfApp1.Views.ShellView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:cal="http://www.caliburnproject.org"
        Title="XmlData Tree Test"
        x:Name="TestControl"
        Width="250"
        Height="350"
        >

根层次结构模板 将项源与标记关联放置在TextBlock上,并且相对源具有自身属性

<HierarchicalDataTemplate DataType="root" ItemsSource="{Binding XPath=./*}" >
            <StackPanel Orientation="Horizontal">
                <TextBlock Margin="0" Text="ROOT"  Tag="{Binding DataContext, ElementName=TestControl}">
                    <TextBlock.ContextMenu>
                        <ContextMenu
                        cal:Action.TargetWithoutContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
                            <MenuItem Header="Add Element" cal:Message.Attach="[Event Click] = [Action AddElement($datacontext)]" />
                        </ContextMenu>
                    </TextBlock.ContextMenu>
                    </TextBlock>
            </StackPanel>
        </HierarchicalDataTemplate>

节点的分层模板

<HierarchicalDataTemplate DataType="Node"
                                  ItemsSource="{Binding XPath=./*}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Margin="0"
                           Text="Node:" />
                <TextBlock Margin="5,0,0,0"  Tag="{Binding DataContext, ElementName=TestControl}"
                           Text="{Binding XPath=@name}" >
                    <TextBlock.ContextMenu>
                        <ContextMenu
                            cal:Action.TargetWithoutContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
                            <MenuItem Header="Add Element" cal:Message.Attach="[Event Click] = [Action AddElement($datacontext)]" />
                        </ContextMenu>
                    </TextBlock.ContextMenu>
                </TextBlock>
            </StackPanel>
        </HierarchicalDataTemplate>

输出示例, 为了根

对于节点,

您可能需要将上下文菜单进一步移动到树状视图、项目模板中,并将上下文菜单添加到节点中的标签/文本块中

例如,考虑下面的雇员树(由于我不知道您的数据结构而进行仿真),

下面这行代码确保了绑定正确(到ViewModel)
TestControl
是用户控件的x:Name

cal:Action.TargetWithoutContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}"
最后,单击操作将修改如下

cal:Message.Attach="[Event Click] = [Action AddElement($datacontext)]"
这将确保在传递正确参数的情况下调用ViewModel的操作

更新

<HierarchicalDataTemplate DataType="Node"
                                  ItemsSource="{Binding XPath=./*}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Margin="0"
                           Text="Node:" />
                <TextBlock Margin="5,0,0,0"  Tag="{Binding DataContext, ElementName=TestControl}"
                           Text="{Binding XPath=@name}" >
                    <TextBlock.ContextMenu>
                        <ContextMenu
                            cal:Action.TargetWithoutContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
                            <MenuItem Header="Add Element" cal:Message.Attach="[Event Click] = [Action AddElement($datacontext)]" />
                        </ContextMenu>
                    </TextBlock.ContextMenu>
                </TextBlock>
            </StackPanel>
        </HierarchicalDataTemplate>
根据您的评论和代码,以下是所需的更改

窗口定义:添加x:Name

<Window
        x:Class="WpfApp1.Views.ShellView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:cal="http://www.caliburnproject.org"
        Title="XmlData Tree Test"
        x:Name="TestControl"
        Width="250"
        Height="350"
        >

根层次结构模板 将项源与标记关联放置在TextBlock上,并且相对源具有自身属性

<HierarchicalDataTemplate DataType="root" ItemsSource="{Binding XPath=./*}" >
            <StackPanel Orientation="Horizontal">
                <TextBlock Margin="0" Text="ROOT"  Tag="{Binding DataContext, ElementName=TestControl}">
                    <TextBlock.ContextMenu>
                        <ContextMenu
                        cal:Action.TargetWithoutContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
                            <MenuItem Header="Add Element" cal:Message.Attach="[Event Click] = [Action AddElement($datacontext)]" />
                        </ContextMenu>
                    </TextBlock.ContextMenu>
                    </TextBlock>
            </StackPanel>
        </HierarchicalDataTemplate>

节点的分层模板

<HierarchicalDataTemplate DataType="Node"
                                  ItemsSource="{Binding XPath=./*}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Margin="0"
                           Text="Node:" />
                <TextBlock Margin="5,0,0,0"  Tag="{Binding DataContext, ElementName=TestControl}"
                           Text="{Binding XPath=@name}" >
                    <TextBlock.ContextMenu>
                        <ContextMenu
                            cal:Action.TargetWithoutContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
                            <MenuItem Header="Add Element" cal:Message.Attach="[Event Click] = [Action AddElement($datacontext)]" />
                        </ContextMenu>
                    </TextBlock.ContextMenu>
                </TextBlock>
            </StackPanel>
        </HierarchicalDataTemplate>

输出示例, 为了根

对于节点,

首先-非常感谢您的回答,但不幸的是,这段代码似乎不起作用。我试图使用它,但没有成功。我有一个异常“找不到方法AddElement的目标”。我有个问题-什么是“测试控制”?你能提供一个更完整的代码或者一些指向githhub的链接吗?@whizzkey“TestControl”是你的用户控件的x:Name。这将有助于获取与控件关联的viewmodel。另一个错误,Addelement将与之相关,因为ViewModel中存在的Addelement,并且因为找不到TestControl,所以ViewModel没有与之关联。我会添加更多的代码,可能是git,但可能是晚上,因为我不在办公桌上。同时,如果你能将x:Name添加到你的UserControl并再次测试它,那将是非常感谢你的帮助,你能给我一个关于这个问题的回答吗,请:你在第一句话中写道“TestControl”是你的UserControl的x:Name。什么是用户控件?整体视图,如窗户或其他什么?我用treeview和caliburn制作了一个简单的应用程序,在我的帖子中描述了一个问题,我把它推到git中,你能检查一下并帮我解决吗@如果这是一个窗口,它应该是窗口的名称。我以为你已经创建了一个用户控件。所以,在你的例子中,TestControl是你窗口的名称。所以我假设它是正确的,我将x:name=“TestControl”放在了窗口中,但不幸的是,我的简单应用程序仍然向我抛出了一个错误“找不到method AddElement的目标”。首先,非常感谢你的回答,但不幸的是,这段代码似乎不起作用。我试图使用它,但没有成功。我有一个异常“找不到方法AddElement的目标”。我有个问题-什么是“测试控制”?你能提供一个更完整的代码或者一些指向githhub的链接吗?@whizzkey“TestControl”是你的用户控件的x:Name。这将有助于获取与控件关联的viewmodel。另一个错误,Addelement将与之相关,因为ViewModel中存在的Addelement,并且因为找不到TestControl,所以ViewModel没有与之关联。我会添加更多的代码,可能是git,但可能是晚上,因为我不在办公桌上。同时,如果你能将x:Name添加到你的UserControl并再次测试它,那将是非常感谢你的帮助,你能给我一个关于这个问题的回答吗,请:你在第一句话中写道“TestControl”是你的UserControl的x:Name。什么是用户控件?整体视图,即窗户或其他东西