【问题标题】:Access my Window's DataContext inside a DataTemplate在 DataTemplate 中访问我的 Window 的 DataContext
【发布时间】:2012-06-29 16:23:56
【问题描述】:

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

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

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

System.Windows.Data 错误:4:找不到绑定源 参考“元素名=根”。 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/

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

【问题讨论】:

    标签: wpf xaml mvvm datacontext


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      【讨论】:

      • @AndersLindas 抱歉,我没有意识到您正在使用ContextMenu。我更新了答案。
      【解决方案3】:

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

      详情请参阅此链接 - http://social.msdn.microsoft.com/Forums/nl/wpf/thread/526ab350-8788-4bc6-a98a-1e4dee6ad33a 它包含您想要在这里实现的目标。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-24
        • 2021-12-21
        • 2016-01-19
        • 2010-10-12
        • 1970-01-01
        • 2011-01-26
        • 1970-01-01
        相关资源
        最近更新 更多