diff --git a/samples/ControlCatalog/Pages/DataGridPage.xaml b/samples/ControlCatalog/Pages/DataGridPage.xaml
index f7e3cf2441..31b4039d33 100644
--- a/samples/ControlCatalog/Pages/DataGridPage.xaml
+++ b/samples/ControlCatalog/Pages/DataGridPage.xaml
@@ -13,9 +13,22 @@
+
+
+
+
@@ -31,7 +44,9 @@
-
+
diff --git a/src/Avalonia.Base/LogicalTree/ChildIndexChangedEventArgs.cs b/src/Avalonia.Base/LogicalTree/ChildIndexChangedEventArgs.cs
index de41f5292c..497596fcc1 100644
--- a/src/Avalonia.Base/LogicalTree/ChildIndexChangedEventArgs.cs
+++ b/src/Avalonia.Base/LogicalTree/ChildIndexChangedEventArgs.cs
@@ -8,7 +8,9 @@ namespace Avalonia.LogicalTree
///
public class ChildIndexChangedEventArgs : EventArgs
{
- public ChildIndexChangedEventArgs()
+ public static new ChildIndexChangedEventArgs Empty { get; } = new ChildIndexChangedEventArgs();
+
+ private ChildIndexChangedEventArgs()
{
}
diff --git a/src/Avalonia.Controls.DataGrid/DataGrid.cs b/src/Avalonia.Controls.DataGrid/DataGrid.cs
index 9dfb34517b..9b67c9b096 100644
--- a/src/Avalonia.Controls.DataGrid/DataGrid.cs
+++ b/src/Avalonia.Controls.DataGrid/DataGrid.cs
@@ -669,8 +669,6 @@ namespace Avalonia.Controls
ItemsProperty.Changed.AddClassHandler((x, e) => x.OnItemsPropertyChanged(e));
CanUserResizeColumnsProperty.Changed.AddClassHandler((x, e) => x.OnCanUserResizeColumnsChanged(e));
ColumnWidthProperty.Changed.AddClassHandler((x, e) => x.OnColumnWidthChanged(e));
- RowBackgroundProperty.Changed.AddClassHandler((x, e) => x.OnRowBackgroundChanged(e));
- AlternatingRowBackgroundProperty.Changed.AddClassHandler((x, e) => x.OnRowBackgroundChanged(e));
FrozenColumnCountProperty.Changed.AddClassHandler((x, e) => x.OnFrozenColumnCountChanged(e));
GridLinesVisibilityProperty.Changed.AddClassHandler((x, e) => x.OnGridLinesVisibilityChanged(e));
HeadersVisibilityProperty.Changed.AddClassHandler((x, e) => x.OnHeadersVisibilityChanged(e));
@@ -1144,14 +1142,6 @@ namespace Avalonia.Controls
InvalidateCellsArrange();
}
- private void OnRowBackgroundChanged(AvaloniaPropertyChangedEventArgs e)
- {
- foreach (DataGridRow row in GetAllRows())
- {
- row.EnsureBackground();
- }
- }
-
private void OnColumnWidthChanged(AvaloniaPropertyChangedEventArgs e)
{
var value = (DataGridLength)e.NewValue;
diff --git a/src/Avalonia.Controls.DataGrid/DataGridColumn.cs b/src/Avalonia.Controls.DataGrid/DataGridColumn.cs
index a77b482436..4a7137dcda 100644
--- a/src/Avalonia.Controls.DataGrid/DataGridColumn.cs
+++ b/src/Avalonia.Controls.DataGrid/DataGridColumn.cs
@@ -199,7 +199,7 @@ namespace Avalonia.Controls
if (change.Property == IsVisibleProperty)
{
OwningGrid?.OnColumnVisibleStateChanging(this);
- var isVisible = (change as AvaloniaPropertyChangedEventArgs).NewValue.Value;
+ var isVisible = change.NewValue.GetValueOrDefault();
if (_headerCell != null)
{
diff --git a/src/Avalonia.Controls.DataGrid/DataGridColumnCollection.cs b/src/Avalonia.Controls.DataGrid/DataGridColumnCollection.cs
index 922b1d9c08..e7f9a9a6c4 100644
--- a/src/Avalonia.Controls.DataGrid/DataGridColumnCollection.cs
+++ b/src/Avalonia.Controls.DataGrid/DataGridColumnCollection.cs
@@ -12,7 +12,8 @@ namespace Avalonia.Controls
{
internal class DataGridColumnCollection : ObservableCollection
{
- private DataGrid _owningGrid;
+ private readonly Dictionary _columnsMap = new Dictionary();
+ private readonly DataGrid _owningGrid;
public DataGridColumnCollection(DataGrid owningGrid)
{
@@ -124,18 +125,8 @@ namespace Avalonia.Controls
internal int VisibleColumnCount
{
- get
- {
- int visibleColumnCount = 0;
- for (int columnIndex = 0; columnIndex < ItemsInternal.Count; columnIndex++)
- {
- if (ItemsInternal[columnIndex].IsVisible)
- {
- visibleColumnCount++;
- }
- }
- return visibleColumnCount;
- }
+ get;
+ private set;
}
internal double VisibleEdgedColumnsWidth
@@ -287,20 +278,31 @@ namespace Avalonia.Controls
{
VisibleStarColumnCount = 0;
VisibleEdgedColumnsWidth = 0;
+ VisibleColumnCount = 0;
+ _columnsMap.Clear();
+
for (int columnIndex = 0; columnIndex < ItemsInternal.Count; columnIndex++)
{
- if (ItemsInternal[columnIndex].IsVisible)
+ var item = ItemsInternal[columnIndex];
+ _columnsMap[columnIndex] = item.DisplayIndex;
+ if (item.IsVisible)
{
- ItemsInternal[columnIndex].EnsureWidth();
- if (ItemsInternal[columnIndex].Width.IsStar)
+ VisibleColumnCount++;
+ item.EnsureWidth();
+ if (item.Width.IsStar)
{
VisibleStarColumnCount++;
}
- VisibleEdgedColumnsWidth += ItemsInternal[columnIndex].ActualWidth;
+ VisibleEdgedColumnsWidth += item.ActualWidth;
}
}
}
+ internal int GetColumnDisplayIndex(int columnIndex)
+ {
+ return _columnsMap.TryGetValue(columnIndex, out var displayIndex) ? displayIndex : -1;
+ }
+
internal DataGridColumn GetColumnAtDisplayIndex(int displayIndex)
{
if (displayIndex < 0 || displayIndex >= ItemsInternal.Count || displayIndex >= DisplayIndexMap.Count)
diff --git a/src/Avalonia.Controls.DataGrid/DataGridColumns.cs b/src/Avalonia.Controls.DataGrid/DataGridColumns.cs
index a4577ee952..52f0ad7537 100644
--- a/src/Avalonia.Controls.DataGrid/DataGridColumns.cs
+++ b/src/Avalonia.Controls.DataGrid/DataGridColumns.cs
@@ -444,12 +444,11 @@ namespace Avalonia.Controls
// We need to explicitly collapse the cells of the invisible column because layout only goes through
// visible ones
- if (!updatedColumn.IsVisible)
+ ColumnHeaders?.InvalidateChildIndex();
+ foreach (var row in GetAllRows())
{
- foreach (DataGridRow row in GetAllRows())
- {
- row.Cells[updatedColumn.Index].IsVisible = false;
- }
+ row.Cells[updatedColumn.Index].IsVisible = updatedColumn.IsVisible;
+ row.InvalidateCellsIndex();
}
}
diff --git a/src/Avalonia.Controls.DataGrid/DataGridDataConnection.cs b/src/Avalonia.Controls.DataGrid/DataGridDataConnection.cs
index fade597ca1..a3095ad214 100644
--- a/src/Avalonia.Controls.DataGrid/DataGridDataConnection.cs
+++ b/src/Avalonia.Controls.DataGrid/DataGridDataConnection.cs
@@ -77,7 +77,7 @@ namespace Avalonia.Controls
private set;
}
- public int Count => GetCount(true);
+ public int Count => TryGetCount(true, false, out var count) ? count : 0;
public bool DataIsPrimitive
{
@@ -193,22 +193,25 @@ namespace Avalonia.Controls
}
}
- internal bool Any()
- {
- return GetCount(false) > 0;
- }
-
/// When "allowSlow" is false, method will not use Linq.Count() method and will return 0 or 1 instead.
- private int GetCount(bool allowSlow)
+ /// If "getAny" is true, method can use Linq.Any() method to speedup.
+ internal bool TryGetCount(bool allowSlow, bool getAny, out int count)
{
- return DataSource switch
+ bool result;
+ (result, count) = DataSource switch
{
- ICollection collection => collection.Count,
- DataGridCollectionView cv => cv.Count,
- IEnumerable enumerable when allowSlow => enumerable.Cast