1

我正在开发 WPF 应用程序,并且正在使用 MVVM 模式。我使用 MVVMLight 来帮助我处理一些事件。我需要转发“Click”事件,以便我也可以传递参数,以便我可以确定发送事件的项目。如果我使用“命令”,我不能确定它是发送事件的选定项目 - 因为不需要选择该项目来右键单击它。

这是我用于显示“订单行”列表的代码。订单行有两种类型,一种是数据类型;“AccessoryOrderLine” - 我想添加一个上下文菜单。

我的问题是我无法访问 Window 的 DataContext。我已将 Window 中的根节点命名为“root”,并且正在尝试访问根的 DataContext,但这失败并出现以下错误:

System.Windows.Data 错误:4:找不到与引用“ElementName = root”绑定的源。BindingExpression:Path=DataContext.PackAccessory; 数据项=空;目标元素是“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”。

http://www.thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/

找到了解决我的问题的方法:)

4

3 回答 3

1

找到了解决方案。用我的解决方案的链接更新了我的原始帖子。

于 2012-06-28T09:06:32.323 回答
0

它不是 DataTemplate 的问题。与 ElemetName 绑定适用于所有情况,但 ContextMenu 除外,因为它与窗口不在同一可视树中。但是,有一种技巧可以让您使用PlacementTarget上下文菜单的属性。

有关详细信息,请参阅此链接 - http://social.msdn.microsoft.com/Forums/nl/wpf/thread/526ab350-8788-4bc6-a98a-1e4dee6ad33a 它包含您在此处尝试实现的目标。

于 2012-06-28T08:20:51.063 回答
0

似乎这里是您问题的答案:

于 2012-06-28T08:57:22.637 回答