【问题标题】:Binding To the Parent of A Context Menu Which is A Templated Grid绑定到作为模板网格的上下文菜单的父级
【发布时间】:2013-10-11 17:32:03
【问题描述】:

在 WPF .Net 4 应用程序中有一个主详细信息情况,其中数据网格具有可以具有在具有内部数据网格的 RowDetailsTemplate 中找到的详细信息的行。

在 RowDetailsTemplate 内是一个网格,用于保存具有上下文菜单的子详细信息。发现的问题是,当绑定详细信息的 MenuItem 之一的 CommandTarget 时,我无法将 详细信息数据网格定位为 由模板生成。下面的绑定最终得到主数据网格,而不是包含详细信息/上下文菜单的包含数据网格。

<DataGrid x:Name="dgEditScript" ItemsSource="{Binding CurrentScript}">

<DataGrid.CommandBindings>
    <CommandBinding Command="commands:ScriptingCommands.SetChecked"
                    Executed="CheckAllAfter" />
</DataGrid.CommandBindings>

<DataGrid.RowDetailsTemplate>
    <DataTemplate>
        <DataGrid ItemsSource="{Binding SubCommands}">
            <DataGrid.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="Check All From Selected"
                              Command="commands:ScriptingCommands.SetChecked"
                              CommandTarget="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}">
                        <MenuItem.Icon>
                            <Image Source="Images/checkboxes.png" />
                        </MenuItem.Icon>
                    </MenuItem>
                </ContextMenu>
            </DataGrid.ContextMenu>
        </DataGrid>
    </DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>

使用上述 Realtive 源绑定时的问题,它给了我 dgEditScript 网格(顶层)而不是上下文菜单的父级,即启动上下文菜单的未命名的持有 DataGrid。

如何获取绑定中的子网格;以上下文菜单的父级为目标?

【问题讨论】:

    标签: wpf xaml binding .net-4.0 datagrid


    【解决方案1】:

    如果我对您的问题的理解正确,那么您有一组项目,并且您希望将上下文菜单附加到所选项目(当您右键单击它时...)

    这是我正在使用的一些类似代码:

    <ListBox x:Name="name_here"  
          ItemsSource="{Binding source_collection_name}"
          SelectedItem="{Binding property_name_on_VM, UpdateSourceTrigger=PropertyChanged}"
           >
        <ListBox.ContextMenu>
            <ContextMenu>
                <MenuItem Header ="Edit Item"   Command="{Binding EditItem_Command}" 
                          CommandParameter="{Binding property_name_on_VM}"
                />
                <MenuItem Header ="Delete Item" Command="{Binding DeleteItem_Command}" 
                           CommandParameter="{Binding property_name_on_VM}"
                />
            </ContextMenu>
        </ListBox.ContextMenu>
    </ListBox>
    

    这样,每当您单击某个项目(或右键单击)时,它就会被选中,然后您只需将该项目作为命令参数发送,这样您就有了您需要的项目。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-05-04
      • 2014-12-09
      • 1970-01-01
      • 2011-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多