From e75a119d4afcabb59c41956b52aafa4bc530f014 Mon Sep 17 00:00:00 2001 From: Edward Miller Date: Thu, 28 Dec 2023 22:58:35 -0600 Subject: [PATCH] initialize column data type if needed --- Maui.DataGrid/DataGrid.xaml.cs | 2 ++ Maui.DataGrid/DataGridColumn.cs | 23 +++++++++++++++-------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/Maui.DataGrid/DataGrid.xaml.cs b/Maui.DataGrid/DataGrid.xaml.cs index 19c605b..7ac2aa6 100644 --- a/Maui.DataGrid/DataGrid.xaml.cs +++ b/Maui.DataGrid/DataGrid.xaml.cs @@ -1285,6 +1285,8 @@ private void InitHeaderView() { var col = Columns[i]; + col.InitializeDataType(); + col.ColumnDefinition ??= new(col.Width); col.DataGrid ??= this; diff --git a/Maui.DataGrid/DataGridColumn.cs b/Maui.DataGrid/DataGridColumn.cs index 5471f27..fac07df 100644 --- a/Maui.DataGrid/DataGridColumn.cs +++ b/Maui.DataGrid/DataGridColumn.cs @@ -173,6 +173,8 @@ public event EventHandler SizeChanged internal SortingOrder SortingOrder { get; set; } + internal Type? DataType { get; private set; } + internal DataGrid? DataGrid { get; set; } internal ColumnDefinition? ColumnDefinition @@ -338,15 +340,9 @@ public bool IsSortable(DataGrid dataGrid) { _isSortable = false; } - else + else if (DataType is not null) { - var listItemType = dataGrid.ItemsSource.GetType().GetGenericArguments().Single(); - var columnDataType = listItemType.GetProperty(PropertyName)?.PropertyType; - - if (columnDataType is not null) - { - _isSortable = typeof(IComparable).IsAssignableFrom(columnDataType); - } + _isSortable = typeof(IComparable).IsAssignableFrom(DataType); } } catch @@ -357,6 +353,17 @@ public bool IsSortable(DataGrid dataGrid) return _isSortable ??= false; } + internal void InitializeDataType() + { + ArgumentNullException.ThrowIfNull(DataGrid); + + if (DataType == null && EditCellTemplate == null) + { + var rowDataType = DataGrid.ItemsSource.GetType().GetGenericArguments().Single(); + DataType = rowDataType.GetProperty(PropertyName)?.PropertyType; + } + } + private void OnSizeChanged() => _sizeChangedEventManager.HandleEvent(this, EventArgs.Empty, nameof(SizeChanged)); #endregion Methods