1

在 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。

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

4

1 回答 1

0

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

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

<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-10-12T04:01:09.630 回答