Wpf 访问我的窗口';在DataTemplate中创建DataContext

Wpf 访问我的窗口';在DataTemplate中创建DataContext,wpf,xaml,mvvm,datacontext,Wpf,Xaml,Mvvm,Datacontext,我正在开发一个WPF应用程序,并且正在使用MVVM模式。我使用MVVMLight来帮助我处理一些事件。我需要转发“Click”事件,这样我也可以传递参数,这样我就可以确定是哪个项目发送了事件。如果我使用“命令”,我无法确定发送事件的是所选项目,因为不需要选择该项目即可右键单击它 这是我用来显示“订单行”列表的代码。有两种类型的订单行,其中一种为数据类型;“AccessoryOrderLine”-我想添加上下文菜单 我的问题是无法访问窗口的DataContext。我已将窗口中的根节点命名为“roo

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

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

我的问题是无法访问窗口的DataContext。我已将窗口中的根节点命名为“root”,并尝试访问根节点的DataContext,但由于以下错误而失败:

System.Windows.Data错误:4:找不到与绑定的源 引用'ElementName=root'。 BindingExpression:Path=DataContext.PackAccessory;DataItem=null; 目标元素是“EventToCommand”(HashCode=5903270);目标属性 是“命令”(类型为“ICommand”)


我也尝试过使用“TemplatedParent”,然后我可以访问我的“OrderLine”数据上下文,但我无法再回到我的“MainWindowModel”


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

数据模板没有问题。使用ElemetName绑定在除ContextMenu之外的所有情况下都有效,因为它与窗口不在同一个可视树中。但是,有一种方法可以使用上下文菜单的
PlacementTarget
属性

有关详细信息,请参阅此链接-
它完全包含了您在这里试图实现的目标。

这不是DataTemplate的问题。使用ElemetName绑定在除ContextMenu之外的所有情况下都有效,因为它与窗口不在同一个可视树中。但是,有一种方法可以使用上下文菜单的
PlacementTarget
属性

有关详细信息,请参阅此链接-
它确切地包含了您在这里试图实现的目标。

似乎以下是您问题的答案:


    • 似乎以下是您问题的答案:


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

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

          @anderslinda抱歉,我没有意识到您正在使用
          上下文菜单
          。我更新了答案。@Anderslinda很抱歉,我没有意识到您正在使用
          ContextMenu
          。我更新了答案。
          <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>