C# Caliburn.micro get treeview';单击上下文菜单上的选定项
我的任务是在treeview中使用contextmenu,并通过单击contextmenu元素将选定的treeview项传递给ViewModel 这是我的xaml: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}"
<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。什么是用户控件?整体视图,即窗户或其他东西