- modificata EgwDataGrid per funzionare correttamente (header) anche quando non e' visibile dall'inizio

This commit is contained in:
Emmanuele Sassi
2025-10-31 11:31:50 +01:00
parent 8530f907d3
commit 5132dc4295
+48 -1
View File
@@ -122,6 +122,46 @@ Public Class EgwDataGrid
Private ReadOnly _columnToLayout As New Dictionary(Of DataGridColumn, ColumnLayout)
Private _headersCaptured As Boolean = False
Sub New()
AddHandler Me.Loaded, AddressOf OnDataGridLoaded
AddHandler Columns.CollectionChanged, AddressOf OnColumnsChanged
End Sub
Private Sub OnDataGridLoaded(ByVal sender As Object, ByVal e As RoutedEventArgs)
TryHookPresenter()
End Sub
Private Sub TryHookPresenter()
Dim presenter = FindVisualChild(Of DataGridColumnHeadersPresenter)(Me)
If presenter Is Nothing Then Return
AddHandler presenter.ItemContainerGenerator.StatusChanged, AddressOf OnHeadersGenerated
End Sub
Private Sub OnHeadersGenerated(ByVal sender As Object, ByVal e As EventArgs)
If _headersCaptured Then Return
Dim presenter = FindVisualChild(Of DataGridColumnHeadersPresenter)(Me)
If presenter Is Nothing Then Return
If presenter.ItemContainerGenerator.Status = GeneratorStatus.ContainersGenerated Then
_headersCaptured = True
RemoveHandler presenter.ItemContainerGenerator.StatusChanged, AddressOf OnHeadersGenerated
For i As Integer = 0 To Columns.Count - 1
Dim header = TryCast(presenter.ItemContainerGenerator.ContainerFromIndex(i), DataGridColumnHeader)
If header IsNot Nothing Then
OnColumnHeaderCreated(header)
End If
Next
End If
End Sub
Protected Overridable Sub OnColumnHeaderCreated(ByVal header As DataGridColumnHeader)
GenerateHeaderEvents(header.Column, _columnToLayout(header.Column))
End Sub
Private Sub Layouts_CollectionChanged(sender As Object, e As NotifyCollectionChangedEventArgs)
Select Case e.Action
Case NotifyCollectionChangedAction.Add
@@ -154,6 +194,11 @@ Public Class EgwDataGrid
End Select
End Sub
Private Sub OnColumnsChanged(ByVal sender As Object, ByVal e As NotifyCollectionChangedEventArgs)
_headersCaptured = False
TryHookPresenter()
End Sub
Private Sub AddColumnFromLayout(layout As ColumnLayout)
If Resources.Contains(layout.Key) Then
Dim baseColumn As DataGridColumn = TryCast(Resources(layout.Key), DataGridColumn)
@@ -189,9 +234,11 @@ Public Class EgwDataGrid
If _columnToLayout.TryGetValue(args.Column, l) Then l.SortDirection = args.Column.SortDirection
End Sub
GenerateHeaderEvents(column, layout)
UpdateDisplayIndexes()
End If
Else
ColumnLayouts.Remove(layout)
MessageBox.Show("Errore! Tentativo di caricare una colonna non definita!" & Environment.NewLine & " Column Key: " & layout.Key, "Errore!", MessageBoxButton.OK, MessageBoxImage.Error)
End If
End Sub