wpfvb.netdatagridwpfdatagrideditmode

How to determine whether a WPF DataGrid is in edit mode?


Possible Duplicate:
Code to check if a cell of a DataGrid is currently edited

Is there a way to determine whether a WPF DataGrid is in edit mode / which row is currently edited?


Solution

  • VB.NET

    <Extension>
    Public Function GetContainerFromIndex(Of TContainer As DependencyObject) _
        (ByVal itemsControl As ItemsControl, ByVal index As Integer) As TContainer
      Return DirectCast(
        itemsControl.ItemContainerGenerator.ContainerFromIndex(index), TContainer)
    End Function
    
    <Extension>
    Public Function IsEditing(ByVal dataGrid As DataGrid) As Boolean
      Return dataGrid.GetEditingRow IsNot Nothing
    End Function
    
    <Extension>
    Public Function GetEditingRow(ByVal dataGrid As DataGrid) As DataGridRow
      Dim sIndex = dataGrid.SelectedIndex
      If sIndex >= 0 Then
        Dim selected = dataGrid.GetContainerFromIndex(Of DataGridRow)(sIndex)
        If selected.IsEditing Then Return selected
      End If
    
      For i = 0 To dataGrid.Items.Count - 1
        If i = sIndex Then Continue For
        Dim item = dataGrid.GetContainerFromIndex(Of DataGridRow)(i)
        If item.IsEditing Then Return item
      Next
    
      Return Nothing
    End Function
    

    C#:

    public static TContainer GetContainerFromIndex<TContainer>
      (this ItemsControl itemsControl, int index)
        where TContainer : DependencyObject
    {
      return (TContainer)
        itemsControl.ItemContainerGenerator.ContainerFromIndex(index);
    }
    
    public static bool IsEditing(this DataGrid dataGrid)
    {
      return dataGrid.GetEditingRow() != null;
    }
    
    public static DataGridRow GetEditingRow(this DataGrid dataGrid)
    {
      var sIndex = dataGrid.SelectedIndex;
      if (sIndex >= 0)
      {
        var selected = dataGrid.GetContainerFromIndex<DataGridRow>(sIndex);
        if (selected.IsEditing) return selected;
      }
    
      for (int i = 0; i < dataGrid.Items.Count; i++)
      {
        if (i == sIndex) continue;
        var item = dataGrid.GetContainerFromIndex<DataGridRow>(i);
        if (item.IsEditing) return item;
      }
    
      return null;
    }