Les grilles lentes tuent l'adoption des logiciels. Lorsque votre DataGrid WPF se bloque sur plus de 10 000 enregistrements, les utilisateurs s'en détournent, tout comme vos conversions d'essai. Ce guide vous montre exactement comment mettre en œuvre le chargement asynchrone et la virtualisation avec DataGrid pour WPF de Xceed. Vous obtiendrez un code exploitable, des repères de performance et une comparaison claire des fonctionnalités qui prouve pourquoi Xceed est la solution de choix pour les professionnels .NET sérieux.
Pourquoi la plupart des grilles de données échouent à l'échelle
Les grilles de données WPF standard s'immobilisent lorsqu'elles sont alimentées par des ensembles de données de la taille d'une entreprise. Les blocages de l'interface utilisateur, les pics de mémoire et les défilements lents frustrent les utilisateurs et sabotent les évaluations des essais. La résolution de ces problèmes à l'aide de threads d'arrière-plan ou de la pagination conduit souvent à un code fragile et difficile à maintenir.
Le résultat : Vos meilleures fonctionnalités ne sont jamais visibles, parce que la grille est trop lente à démonter.
Virtualisation asynchrone : Le pont vers des applications WPF à haute performance
DataGrid pour WPF de Xceed est conçu pour la virtualisation asynchrone des données :
- Chargement de plus de 10 000 lignes sans geler l'interface utilisateur
- Utilisation réduite de la mémoire, même avec des ensembles de données volumineux
- Défilement à 60 images par seconde et filtrage instantané, prêts à l'emploi
C'est ce même moteur qui est utilisé dans les industries où les performances sont critiques et où le décalage n'est jamais acceptable.
Mise en œuvre étape par étape : Chargement asynchrone d'une grille de données avec Xceed
Ce que couvre ce guide
- Mise en place d'un projet WPF propre avec DataGrid de Xceed
- Implémentation du chargement asynchrone avec ObservableCollection et les tâches d'arrière-plan
- Configuration de la virtualisation pour une vitesse maximale
- Ajout d'indicateurs de chargement et de gestion des erreurs
- Mesurer les performances, avec des critères de référence que vous pouvez reproduire
Configuration de votre projet WPF avec Xceed DataGrid
Installer le Xceed DataGrid pour WPF via NuGet ou par téléchargement direct.
Exemple de MainWindow.xaml :
<Window x:Class="AsyncDataGridDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:xcdg="http://schemas.xceed.com/wpf/xaml/datagrid">
<Grid>
<xcdg:DataGridControl x:Name="EmployeeDataGrid"
ItemsSource="{Binding Employees}"
AutoCreateColumns="False">
<xcdg:DataGridControl.Columns>
<xcdg:Column FieldName="Id" Title="Employee ID"/>
<xcdg:Column FieldName="Name" Title="Full Name"/>
<xcdg:Column FieldName="Department" Title="Department"/>
<xcdg:Column FieldName="Salary" Title="Salary"/>
</xcdg:DataGridControl.Columns>
</xcdg:DataGridControl>
</Grid>
</Window>
Les colonnes explicites permettent un contrôle total. Pas de surprises, pas de coûts de performance cachés.
Implémentation du chargement de données asynchrone avec ObservableCollection
Définir votre modèle et votre service asynchrone
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
public string Department { get; set; }
public decimal Salary { get; set; }
}
public class EmployeeService
{
public async Task<List<Employee>> GetEmployeesAsync(int skip, int take)
{
await Task.Delay(100); // Simulate DB latency
return Enumerable.Range(skip, take)
.Select(i => new Employee
{
Id = i,
Name = $"Employee {i}",
Department = $"Dept {i % 10}",
Salary = 50000 + (i * 100)
}).ToList();
}
}
ViewModel : Async, Observable et Production-Grade
public class MainViewModel : INotifyPropertyChanged
{
private readonly EmployeeService _employeeService = new EmployeeService();
private ObservableCollection<Employee> _employees = new ObservableCollection<Employee>();
private bool _isLoading;
public ObservableCollection<Employee> Employees
{
get => _employees;
set { _employees = value; OnPropertyChanged(); }
}
public bool IsLoading
{
get => _isLoading;
set { _isLoading = value; OnPropertyChanged(); }
}
public MainViewModel()
{
LoadDataAsync();
}
private async Task LoadDataAsync()
{
IsLoading = true;
try
{
var employees = await _employeeService.GetEmployeesAsync(0, 10000);
await Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
Employees.Clear();
foreach (var employee in employees)
Employees.Add(employee);
}));
}
finally
{
IsLoading = false;
}
}
// Implement INotifyPropertyChanged...
}
Pas de blocage. Pas de piratage. C'est le modèle asynchrone auquel s'attendent les équipes .NET les plus performantes.
Configuration de la virtualisation pour une vitesse maximale de DataGrid
Configuration XAML
<xcdg:DataGridControl x:Name="EmployeeDataGrid"
ItemsSource="{Binding Employees}"
AutoCreateColumns="False">
<xcdg:DataGridControl.View>
<xcdg:TableView UseDefaultHeadersFooters="True"
ShowRowSelectorPane="False">
<xcdg:TableView.FixedHeaders>
<DataTemplate>
<xcdg:ColumnManagerRow AllowColumnReorder="True" AllowSort="True"/>
</DataTemplate>
</xcdg:TableView.FixedHeaders>
</xcdg:TableView>
</xcdg:DataGridControl.View>
<xcdg:DataGridControl.ScrollViewer>
<xcdg:DataGridScrollViewer>
<xcdg:DataGridScrollViewer.ScrollingAnimationDuration>
<Duration>0:0:0.1</Duration>
</xcdg:DataGridScrollViewer.ScrollingAnimationDuration>
</xcdg:DataGridScrollViewer>
</xcdg:DataGridControl.ScrollViewer>
</xcdg:DataGridControl>
Améliorer les performances dans le Code-Behind
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
EmployeeDataGrid.ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged;
}
private void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
{
if (EmployeeDataGrid.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
{
EmployeeDataGrid.SetValue(VirtualizingStackPanel.IsVirtualizingProperty, true);
EmployeeDataGrid.SetValue(VirtualizingStackPanel.VirtualizationModeProperty, VirtualizationMode.Recycling);
}
}
}
La virtualisation est synonyme de mémoire réduite, de rendu instantané et d'absence de décalage, quelle que soit l'échelle.
Ajout d'indicateurs de chargement et gestion des erreurs
UI : Retour d'information sur le chargement asynchrone
<Grid>
<xcdg:DataGridControl x:Name="EmployeeDataGrid"
ItemsSource="{Binding Employees}"
Visibility="{Binding IsLoading, Converter={StaticResource BooleanToVisibilityConverter}, ConverterParameter=Inverted}"/>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"
Visibility="{Binding IsLoading, Converter={StaticResource BooleanToVisibilityConverter}}">
<ProgressBar IsIndeterminate="True" Width="200" Height="20"/>
<TextBlock Text="Loading employee data..." HorizontalAlignment="Center" Margin="0,10,0,0"/>
</StackPanel>
</Grid>
ViewModel : Gestion robuste des erreurs
private async Task LoadDataAsync()
{
IsLoading = true;
try
{
var employees = await _employeeService.GetEmployeesAsync(0, 10000);
await Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
Employees.Clear();
var batchSize = 100;
for (int i = 0; i < employees.Count; i += batchSize)
{
foreach (var employee in employees.Skip(i).Take(batchSize))
Employees.Add(employee);
if (i % (batchSize * 10) == 0)
await Task.Delay(1); // Let UI breathe
}
}));
}
catch (Exception ex)
{
MessageBox.Show($"Error loading data: {ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
finally
{
IsLoading = false;
}
}
Les vrais utilisateurs attendent un retour d'information et une résilience. C'est ce qui convertit les essais en places payantes.
Mesurer la performance : Des repères fiables
Classe de métriques simples
public class PerformanceMetrics
{
public static async Task<TimeSpan> MeasureLoadTime(Func<Task> loadOperation)
{
var sw = Stopwatch.StartNew();
await loadOperation();
sw.Stop();
return sw.Elapsed;
}
public static long GetMemoryUsage()
{
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
return GC.GetTotalMemory(false);
}
}
// Usage:
var loadTime = await PerformanceMetrics.MeasureLoadTime(() => LoadDataAsync());
var memory = PerformanceMetrics.GetMemoryUsage();
Debug.WriteLine($"Load time: {loadTime.TotalMilliseconds}ms, memory: {memory / 1024 / 1024}MB");
Résultats attendus
Taille de l'ensemble de données | Temps de chargement initial | Utilisation de la RAM | Performance du défilement |
---|---|---|---|
10 000 enregistrements | 200-500ms | <50MB | Lisse (60 images par seconde) |
100 000 enregistrements | 1-2s | <100MB | Lisse (60 images par seconde) |
Grâce à une virtualisation appropriée, le DataGrid de Xceed conserve sa réactivité et une faible mémoire, même lorsque le volume de données augmente.
Tableau de comparaison des fonctionnalités : Xceed DataGrid par rapport aux grilles classiques
Fonctionnalité | Xceed DataGrid pour WPF | Contrôles typiques de la grille de données |
---|---|---|
Virtualisation asynchrone des données | Oui (intégré) | Rare ou limité |
API propre et extensible | Oui | Souvent complexes ou rigides |
Licence perpétuelle | Oui | Souvent sur abonnement |
Regroupement 2D/3D, filtrage, exportation | Oui (nombreuses fonctionnalités) | Partielle ou de base |
Interface utilisateur sans décalage avec de grands ensembles de données | Oui | Non (l'interface utilisateur se fige souvent) |
Support MVVM et theming | Oui | Souvent limité |
Documentation et assistance adaptées | Oui | Variable |
Meilleures pratiques pour les déploiements en production
- Taille du lot : Commencez avec 100-500 par lot, ajustez en fonction de la forme de vos données.
- Mémoire : Activez toujours la virtualisation, recyclez les conteneurs.
- Commentaires des utilisateurs : Afficher la progression des opérations de plus de 200 ms.
- Récupération des erreurs : Ajouter une logique de réessai en cas de défaillance du réseau.
- Mise en cache : Mettre en cache les requêtes fréquentes pour les recharger instantanément.
Conclusion : Pourquoi Xceed est la grille de données WPF pour les professionnels de .NET
DataGrid de Xceed pour WPF est conçu pour les scénarios asynchrones à haut volume où la performance n'est pas optionnelle.
- Le chargement asynchrone et la virtualisation de l'interface utilisateur signifient qu'il n'y a jamais de gel.
- Une API propre et extensible facilite l'intégration et le prototypage rapide.
- Les références au monde réel sont synonymes de confiance, et non de battage médiatique.
Comparez ces modèles à toute autre solution. Xceed offre des temps de chargement plus rapides, une mémoire réduite et une licence perpétuelle sans abonnement.
Prêt à voir la différence ?
Téléchargez la version d'essai gratuite de 45 jours iciPour ce faire, intégrez ce modèle dans votre application et mesurez les résultats. Vos utilisateurs - et vos indicateurs de conversion - vous remercieront.
Ressources complémentaires
- Documentation de Xceed DataGrid pour WPF
- Exemples de code GitHub
- Contacter le support Xceed pour l'aide à l'intégration
Installez des convictions, pas seulement des contrôles.
C'est la différence Xceed. Êtes-vous prêt à construire des grilles à l'échelle ?