WPF DataGrid - 如何检测是否选择了完整行?

时间:2017-12-07 20:08:32

标签: .net wpf vb.net

我的WPF应用程序中有DataGrid,我想在SelectedCellsChanged事件中运行一个函数,但是只有在没有完全选择行的情况下,如果用户单击该行的标题,则会发生这种情况。

我的表只有一列。

我尝试过以下代码,rowContainer.IsSelected的值始终为false。

我该怎么做?

Private Sub DataGridEx_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles Me.SelectionChanged

    If SelectedCells.Count <> 1 Then
        Exit Sub
    End If

    If Not SelectedCells.First.Item.ToString.Contains("NewItemPlaceholder") Then

            Me.TheDispatcher.BeginInvoke(
                Sub()
                    Dim cell = SelectedCells.First
                    Dim index = Items.IndexOf(cell.Item) + 1
                    Dim rowContainer As DataGridRow = ItemContainerGenerator.ContainerFromIndex(index)

                    If rowContainer IsNot Nothing Then
                        If Not rowContainer.IsSelected Then
                            ' run a function here
                        End If
                    End If
                End Sub,
                DispatcherPriority.Input)

     End If

End Sub

2 个答案:

答案 0 :(得分:1)

获取select单元格的行容器并检查其WKWebview属性:

IsSelected

如果您使用private void DataGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) { DataGrid dg = sender as DataGrid; if (dg.SelectedCells != null && dg.SelectedCells.Count > 0) { var cell = dg.SelectedCells[0]; var row = dg.ItemContainerGenerator.ContainerFromItem(cell.Item) as DataGridRow; if (row != null && row.IsSelected) { MessageBox.Show("row is selected..."); } } } SelectionUnit

,这应该有用

答案 1 :(得分:0)

您可以做的一件事是将您的数据网格强制为SelectionUnit,如FullRow,Cell或CellOrRowHeader

dim dg = new DataGrid();
dg.SelectionUnit == System.Windows.Controls.DataGridSelectionUnit.FullRow;
dg.SelectionUnit == System.Windows.Controls.DataGridSelectionUnit.CellOrRowHeader;
dg.SelectionUnit == System.Windows.Controls.DataGridSelectionUnit.Cell;

在XAML中,您只需应用属性设置

<DataGrid SelectionUnit="FullRow" ... >

然后你应该能够简单地挂钩到SelectedCellsChanged或SelectionChanged方法来对它采取行动......

然后,您不必担心只选择一个或两个单元格的部分行,而不会触发您希望处理的整行。通过强制一个完整的行,它将在其集合中每行有一个条目。否则,如果你有单元格并且有5列宽,而人在两行上选择3个单元格,则它将有6个单元格代表覆盖行的每个单独单元格的相同行。

HTH