在DataTemplate中访问我的Window的DataContext

时间:2012-06-28 07:15:38

标签: wpf xaml mvvm datacontext

我正在使用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”。

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

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

3 个答案:

答案 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)