我的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
答案 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