我正在使用WPF应用程序而我正在使用MVVM模式。我使用MVVMLight来帮助我处理一些事件。我需要转发“Click”事件,以便我也可以传递参数,以便我可以确定发送事件的项目。如果我使用“命令”,我无法确定它是发送事件的所选项目 - 因为不需要选择该项目以右键单击它。
这是我显示“订单行”列表的代码。订单行有两种类型,其中一种是数据类型; “AccessoryOrderLine” - 我想添加一个上下文菜单。
我的问题是我无法访问我的Window的DataContext。我已经在Window“root”中命名了根节点,我正在尝试访问root的DataContext,但这会导致以下错误:
System.Windows.Data错误:4:找不到绑定源 引用'ElementName = root'。 BindingExpression:路径= DataContext.PackAccessory;的DataItem = NULL; target元素是'EventToCommand'(HashCode = 5903270);目标财产 是'命令'(输入'ICommand')
<ListBox HorizontalContentAlignment="Stretch" Margin="10,0,10,10" DockPanel.Dock="Bottom" Grid.Row="1" ItemsSource="{Binding OrderLines, NotifyOnSourceUpdated=True, NotifyOnTargetUpdated=True, UpdateSourceTrigger=PropertyChanged}">
<ListBox.Resources>
<DataTemplate DataType="{x:Type m:UnitOrderLine}">
<v:OrderLine />
</DataTemplate>
<DataTemplate DataType="{x:Type m:AccessoryOrderLine}">
<v:OrderLine>
<v:OrderLine.ContextMenu>
<ContextMenu>
<MenuItem Header="Pack 1" IsCheckable="False">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cmd:EventToCommand Command="{Binding ElementName=root, Path=DataContext.PackAccessory }" PassEventArgsToCommand="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
</ContextMenu>
</v:OrderLine.ContextMenu>
</v:OrderLine>
</DataTemplate>
</ListBox.Resources>
</ListBox>
我也尝试使用“TemplatedParent”,然后我可以访问我的“OrderLine”DataContext,但我无法再回到我的“MainWindowModel”。
找到解决我问题的方法:)
答案 0 :(得分:1)
找到解决方案。使用指向我的解决方案的链接更新了我的原始帖子。
答案 1 :(得分:0)
它不是DataTemplate的问题。与ElemetName绑定适用于所有情况,但ContextMenu的情况除外,因为它不在窗口的同一视觉树中。但是,有一个hack可以使用上下文菜单的PlacementTarget
属性。
有关详细信息,请参阅此链接 - http://social.msdn.microsoft.com/Forums/nl/wpf/thread/526ab350-8788-4bc6-a98a-1e4dee6ad33a 它包含了你想要在这里实现的目标。
答案 2 :(得分:0)