获取WPF数据网格上下文菜单单击"行"

O.O*_*.O. 19 c# wpf wpfdatagrid wpf-4.0

我有一个WPF DataGrid

<DataGrid AutoGenerateColumns="False"  Name="dataGrid1"  IsReadOnly="True" >
<DataGrid.Columns>
    <DataGridTextColumn Header="Site" Binding="{Binding Site}" Width="150" />
    <DataGridTextColumn Header="Subject" Binding="{Binding Subject}" Width="310" />
</DataGrid.Columns>
<DataGrid.ContextMenu>
    <ContextMenu>
        <MenuItem Header="Delete" Click="Context_Delete">
            <MenuItem.Icon>
                <Image Width="12" Height="12" Source="Images/Delete.png" />
            </MenuItem.Icon>
        </MenuItem>
    </ContextMenu>
</DataGrid.ContextMenu>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

我有点击事件处理程序:

private void Context_Delete(object sender, System.EventArgs e)  { }
Run Code Online (Sandbox Code Playgroud)

如何在单击之前获取上下文菜单所在的行?该sender对象是System.Windows.Controls.MenuItem,不是DataGridRow.如何获取DataGridRow单击上下文菜单的位置.(我DataGrid.ItemSource在代码后面设置文件.)

dsf*_*sho 29

因此,基于您的示例代码,我假设您将DataGrid绑定到ObservableCollection对象,并将属性Site和Subject绑定到DataGridColumns.

基本上,您需要做的就是找出绑定到单击的DataGridRow的项目是什么,并从ObservableCollection中删除它.以下是一些示例代码,可帮助您入门:

private void Context_Delete(object sender, RoutedEventArgs e)
{
    //Get the clicked MenuItem
    var menuItem = (MenuItem)sender;

    //Get the ContextMenu to which the menuItem belongs
    var contextMenu = (ContextMenu)menuItem.Parent;

    //Find the placementTarget
    var item = (DataGrid)contextMenu.PlacementTarget;

    //Get the underlying item, that you cast to your object that is bound
    //to the DataGrid (and has subject and state as property)
    var toDeleteFromBindedList = (YourObject)item.SelectedCells[0].Item;

    //Remove the toDeleteFromBindedList object from your ObservableCollection
    yourObservableCollection.Remove(toDeleteFromBindedList);
}
Run Code Online (Sandbox Code Playgroud)


mor*_*cer 7

通常,您不处理行(如果您这样做 - 再考虑一下原因) - 而是使用视图模型.当您打开上下文菜单时,您将选择您的项目,因此可以通过DataGrid.SelectedItem属性访问它.但是,如果你真的需要DataGridRow - 你有你的DataGrid.SelectedIndex,这里有很多关于如何获取行的答案.比如在datagrid中获取行