{"id":3602,"date":"2026-04-02T23:41:26","date_gmt":"2026-04-02T23:41:26","guid":{"rendered":"https:\/\/xceed.com\/?p=3602"},"modified":"2026-04-03T00:23:18","modified_gmt":"2026-04-03T00:23:18","slug":"wpf-datagrid-binding-guide","status":"publish","type":"post","link":"https:\/\/xceed.com\/fr\/blog\/all\/wpf-datagrid-binding-guide\/","title":{"rendered":"WPF DataGrid Binding in C#: 4 Patterns Every Developer Should Know"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"3602\" class=\"elementor elementor-3602\" data-elementor-post-type=\"post\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2f99e023 e-flex e-con-boxed e-con e-parent\" data-id=\"2f99e023\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-67a170bf elementor-widget elementor-widget-text-editor\" data-id=\"67a170bf\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<article><style>\n  .cta-box {\n    background: linear-gradient(145deg, #ff8441 0%, #ff772e 40%, #ff7429 100%);\n    color: #fff;\n    border-radius: 12px;\n    padding: 1.5rem 1.75rem;\n    margin: 2rem 0;\n    box-sizing: border-box;\n    box-shadow: 0 8px 24px rgba(0,0,0,0.08), 0 4px 10px rgba(168,63,8,0.15), inset 0 1px 0 rgba(255,255,255,0.12);\n  }\n  .cta-box h3 { margin: 0 0 0.5rem 0; font-size: 1.25rem; font-weight: 700; color: #fff; }\n  .cta-box p { margin: 0 0 1rem 0; font-size: 1rem; line-height: 1.5; color: #fff; opacity: 0.98; }\n  .cta-box a.cta-link { display: inline-block; background: #fff; color: #ff671b; text-decoration: none; font-weight: 600; padding: 0.5rem 1rem; border-radius: 8px; margin-right: 0.75rem; margin-top: 0.25rem; font-size: 0.9375rem; }\n  .cta-box a.cta-link:hover { background: #f5f5f5; }\n  pre[class*=\"language-\"] { margin: 2rem 0 !important; padding: 1rem 1.25rem !important; overflow-x: auto !important; font-size: 0.9rem !important; line-height: 1.5 !important; border-radius: 10px !important; background: #1e1e1e !important; border: 1px solid #333 !important; color: #d4d4d4 !important; }\n  pre[class*=\"language-\"] code { background: none !important; padding: 0 !important; color: #d4d4d4 !important; font-family: Consolas, Monaco, 'Courier New', monospace !important; }\n  pre[class*=\"language-\"] code span { color: inherit; }\n  pre[class*=\"language-\"] .token.tag { color: #569cd6 !important; }\n  pre[class*=\"language-\"] .token.attr-name { color: #9cdcfe !important; }\n  pre[class*=\"language-\"] .token.attr-value { color: #ce9178 !important; }\n  pre[class*=\"language-\"] .token.punctuation { color: #808080 !important; }\n  pre[class*=\"language-\"] .token.namespace { color: #4ec9b0 !important; }\n  pre[class*=\"language-\"] .token.keyword { color: #569cd6 !important; }\n  pre[class*=\"language-\"] .token.class-name { color: #4ec9b0 !important; }\n  pre[class*=\"language-\"] .token.string { color: #ce9178 !important; }\n  pre[class*=\"language-\"] .token.comment { color: #6a9955 !important; }\n  pre[class*=\"language-\"] .token.property { color: #9cdcfe !important; }\n  pre[class*=\"language-\"] .token.operator { color: #d4d4d4 !important; }\n<\/style>\n<section>\n<p>Every <strong>WPF DataGrid<\/strong> project starts the same way. You create a model, bind a collection, and columns appear automatically. Then the requirements arrive: group rows by department, filter on the fly, let users edit cells and have changes persist. Suddenly, the simple binding isn&#8217;t enough.<\/p>\n<p>This guide walks through four <strong>wpf datagrid binding<\/strong> patterns, from the basics to production-ready scenarios. Each example comes from a working demo project you can download and run today. We&#8217;ll use Xceed DataGrid for WPF because its DataGridCollectionView gives you grouping, sorting, and filtering without writing a custom ICollectionView from scratch.<\/p>\n<h2>What You Need Before Starting<\/h2>\n<p>Install the NuGet package into any .NET 10 (or later) WPF project:<\/p>\n<pre class=\"language-xml\"><code><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token tag\">PackageReference<\/span><\/span> <span class=\"token attr-name\">Include<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"Xceed.Products.Wpf.DataGrid.Full\"<\/span>\n                  <span class=\"token attr-name\">Version<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"7.3.26166.7869\"<\/span> <span class=\"token punctuation\">\/&gt;<\/span><\/code><\/pre>\n<p>Then add the Xceed XAML namespace to your window:<\/p>\n<pre class=\"language-xml\"><code><span class=\"token attr-name\">xmlns:xcdg<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"http:\/\/schemas.xceed.com\/wpf\/xaml\/datagrid\"<\/span><\/code><\/pre>\n<p>That&#8217;s it. No manual DLL references, no license file to drop in a folder. During the 45-day trial you don&#8217;t even need a key.<\/p>\n<h2>Pattern 1: Bind an ObservableCollection<\/h2>\n<p>The most common <strong>wpf datagrid example<\/strong> starts here. You expose a collection from your window or view model, and the DataGridControl picks up the properties as columns automatically.<\/p>\n<h3>The Model<\/h3>\n<pre class=\"language-csharp\"><code><span class=\"token keyword\">public<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">Employee<\/span> <span class=\"token punctuation\">:<\/span> <span class=\"token class-name\">INotifyPropertyChanged<\/span>\n<span class=\"token punctuation\">{<\/span>\n    <span class=\"token keyword\">private<\/span> <span class=\"token keyword\">string<\/span> <span class=\"token property\">_firstName<\/span> <span class=\"token operator\">=<\/span> <span class=\"token keyword\">string<\/span><span class=\"token punctuation\">.<\/span>Empty<span class=\"token punctuation\">;<\/span>\n    <span class=\"token keyword\">private<\/span> <span class=\"token keyword\">string<\/span> <span class=\"token property\">_department<\/span> <span class=\"token operator\">=<\/span> <span class=\"token keyword\">string<\/span><span class=\"token punctuation\">.<\/span>Empty<span class=\"token punctuation\">;<\/span>\n    <span class=\"token keyword\">private<\/span> <span class=\"token keyword\">decimal<\/span> <span class=\"token property\">_salary<\/span><span class=\"token punctuation\">;<\/span>\n\n    <span class=\"token keyword\">public<\/span> <span class=\"token keyword\">string<\/span> FirstName\n    <span class=\"token punctuation\">{<\/span>\n        <span class=\"token keyword\">get<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token property\">_firstName<\/span><span class=\"token punctuation\">;<\/span>\n        <span class=\"token keyword\">set<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token property\">_firstName<\/span> <span class=\"token operator\">=<\/span> value<span class=\"token punctuation\">;<\/span> OnPropertyChanged<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nameof<\/span><span class=\"token punctuation\">(<\/span>FirstName<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span>\n    <span class=\"token punctuation\">}<\/span>\n\n    <span class=\"token keyword\">public<\/span> <span class=\"token keyword\">string<\/span> Department\n    <span class=\"token punctuation\">{<\/span>\n        <span class=\"token keyword\">get<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token property\">_department<\/span><span class=\"token punctuation\">;<\/span>\n        <span class=\"token keyword\">set<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token property\">_department<\/span> <span class=\"token operator\">=<\/span> value<span class=\"token punctuation\">;<\/span> OnPropertyChanged<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nameof<\/span><span class=\"token punctuation\">(<\/span>Department<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span>\n    <span class=\"token punctuation\">}<\/span>\n\n    <span class=\"token keyword\">public<\/span> <span class=\"token keyword\">decimal<\/span> Salary\n    <span class=\"token punctuation\">{<\/span>\n        <span class=\"token keyword\">get<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token property\">_salary<\/span><span class=\"token punctuation\">;<\/span>\n        <span class=\"token keyword\">set<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token property\">_salary<\/span> <span class=\"token operator\">=<\/span> value<span class=\"token punctuation\">;<\/span> OnPropertyChanged<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">nameof<\/span><span class=\"token punctuation\">(<\/span>Salary<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span>\n    <span class=\"token punctuation\">}<\/span>\n\n    <span class=\"token keyword\">public<\/span> <span class=\"token keyword\">event<\/span> <span class=\"token class-name\">PropertyChangedEventHandler<\/span><span class=\"token punctuation\">?<\/span> PropertyChanged<span class=\"token punctuation\">;<\/span>\n    <span class=\"token keyword\">protected<\/span> <span class=\"token keyword\">void<\/span> OnPropertyChanged<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">string<\/span> name<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span>\n        PropertyChanged<span class=\"token operator\">?<\/span><span class=\"token punctuation\">.<\/span>Invoke<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">this<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">PropertyChangedEventArgs<\/span><span class=\"token punctuation\">(<\/span>name<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>Implementing INotifyPropertyChanged matters because the <strong>WPF DataGrid<\/strong> needs property-change notifications to update cells when your data changes. Without it, edits won&#8217;t reflect in the UI.<\/p>\n<h3>The XAML<\/h3>\n<pre class=\"language-xml\"><code><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">DataGridControl<\/span><\/span> <span class=\"token attr-name\">ItemsSource<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"{Binding Employees}\"<\/span><span class=\"token punctuation\">&gt;<\/span>\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">DataGridControl.View<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">TableflowView<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n            <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">TableflowView.Theme<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n                <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token namespace\">tp5<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">Windows10Theme<\/span><\/span> <span class=\"token punctuation\">\/&gt;<\/span>\n            <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">TableflowView.Theme<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">TableflowView<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">DataGridControl.View<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">DataGridControl.Columns<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">Column<\/span><\/span> <span class=\"token attr-name\">FieldName<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"FirstName\"<\/span> <span class=\"token attr-name\">Title<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"First Name\"<\/span> <span class=\"token punctuation\">\/&gt;<\/span>\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">Column<\/span><\/span> <span class=\"token attr-name\">FieldName<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"LastName\"<\/span> <span class=\"token attr-name\">Title<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"Last Name\"<\/span> <span class=\"token punctuation\">\/&gt;<\/span>\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">Column<\/span><\/span> <span class=\"token attr-name\">FieldName<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"Department\"<\/span> <span class=\"token attr-name\">Title<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"Department\"<\/span> <span class=\"token punctuation\">\/&gt;<\/span>\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">Column<\/span><\/span> <span class=\"token attr-name\">FieldName<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"Title\"<\/span> <span class=\"token attr-name\">Title<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"Title\"<\/span> <span class=\"token punctuation\">\/&gt;<\/span>\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">Column<\/span><\/span> <span class=\"token attr-name\">FieldName<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"Salary\"<\/span> <span class=\"token attr-name\">Title<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"Salary\"<\/span> <span class=\"token punctuation\">\/&gt;<\/span>\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">DataGridControl.Columns<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n<span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">DataGridControl<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/code><\/pre>\n<p>Notice that Xceed uses DataGridControl instead of the built-in DataGrid. The ItemsSource binding works identically, but you get TableflowView with smooth scrolling and a theme system out of the box. If you skip the Columns definition entirely, the grid auto-generates columns from your model properties \u2014 useful for quick prototyping.<\/p>\n<img decoding=\"async\" src=\"https:\/\/xceed.com\/wp-content\/uploads\/2026\/04\/01-basic-binding.png\" alt=\"WPF DataGrid binding example showing employee data in Xceed DataGridControl with TableflowView\" \/>\n<h2>Pattern 2: Group and Sort with DataGridCollectionViewSource<\/h2>\n<p>Raw ObservableCollection binding falls short the moment you need grouping or sorting baked into the view. The built-in WPF approach requires CollectionViewSource plus custom GroupStyle templates \u2014 a lot of XAML for a common requirement. Xceed&#8217;s DataGridCollectionViewSource handles this declaratively.<\/p>\n<h3>The XAML<\/h3>\n<pre class=\"language-xml\"><code><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token tag\">Window.Resources<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">DataGridCollectionViewSource<\/span><\/span> <span class=\"token attr-name\">x:Key<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"GroupedEmployees\"<\/span>\n        <span class=\"token attr-name\">Source<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"{Binding Employees}\"<\/span><span class=\"token punctuation\">&gt;<\/span>\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">DataGridCollectionViewSource.GroupDescriptions<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n            <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">DataGridGroupDescription<\/span><\/span> <span class=\"token attr-name\">PropertyName<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"Department\"<\/span> <span class=\"token punctuation\">\/&gt;<\/span>\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">DataGridCollectionViewSource.GroupDescriptions<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">DataGridCollectionViewSource.SortDescriptions<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n            <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token namespace\">scm<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">SortDescription<\/span><\/span> <span class=\"token attr-name\">PropertyName<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"LastName\"<\/span>\n                                 <span class=\"token attr-name\">Direction<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"Ascending\"<\/span> <span class=\"token punctuation\">\/&gt;<\/span>\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">DataGridCollectionViewSource.SortDescriptions<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">DataGridCollectionViewSource<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n<span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span><span class=\"token tag\">Window.Resources<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n\n<span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">DataGridControl<\/span><\/span>\n    <span class=\"token attr-name\">ItemsSource<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"{Binding Source={StaticResource GroupedEmployees}}\"<\/span><span class=\"token punctuation\">&gt;<\/span>\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">DataGridControl.View<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">TableflowView<\/span><\/span> <span class=\"token attr-name\">IsAlternatingRowStyleEnabled<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"True\"<\/span><span class=\"token punctuation\">&gt;<\/span>\n            <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">TableflowView.Theme<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n                <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token namespace\">tp5<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">Windows10Theme<\/span><\/span> <span class=\"token punctuation\">\/&gt;<\/span>\n            <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">TableflowView.Theme<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">TableflowView<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">DataGridControl.View<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n<span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">DataGridControl<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/code><\/pre>\n<p>Add the scm namespace for SortDescription: xmlns:scm=&#8221;clr-namespace:System.ComponentModel;assembly=WindowsBase&#8221;.<\/p>\n<p>Three lines of XAML give you grouped rows with collapsible headers, sorted alphabetically within each group. In contrast, the built-in <strong>WPF DataGrid<\/strong> requires a GroupStyle template, an expander control, and manual styling to achieve the same result. DataGridGroupDescription also supports multi-level grouping \u2014 just add more descriptions to the collection.<\/p>\n<img decoding=\"async\" src=\"https:\/\/xceed.com\/wp-content\/uploads\/2026\/04\/02-grouped-binding.png\" alt=\"WPF DataGrid grouped and sorted by department using DataGridCollectionViewSource\" \/>\n<h2>Pattern 3: Live Editing with ObservableCollection<\/h2>\n<p>Real applications need users to add, edit, and remove rows while the grid stays in sync. Since ObservableCollection raises CollectionChanged events, the <strong>WPF DataGrid<\/strong> updates automatically when items come and go. Here&#8217;s the <strong>wpf datagrid binding<\/strong> pattern that supports full CRUD.<\/p>\n<h3>The Code-Behind<\/h3>\n<pre class=\"language-csharp\"><code><span class=\"token keyword\">public<\/span> <span class=\"token class-name\">ObservableCollection<\/span><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">Employee<\/span><span class=\"token punctuation\">&gt;<\/span> Employees <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">get<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span>\n\n<span class=\"token keyword\">public<\/span> MainWindow<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\n<span class=\"token punctuation\">{<\/span>\n    InitializeComponent<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n    DataContext <span class=\"token operator\">=<\/span> <span class=\"token keyword\">this<\/span><span class=\"token punctuation\">;<\/span>\n    Employees <span class=\"token operator\">=<\/span> <span class=\"token class-name\">SampleData<\/span><span class=\"token punctuation\">.<\/span>GetEmployees<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n\n<span class=\"token keyword\">private<\/span> <span class=\"token keyword\">void<\/span> AddEmployee_Click<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">object<\/span> sender<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">RoutedEventArgs<\/span> e<span class=\"token punctuation\">)<\/span>\n<span class=\"token punctuation\">{<\/span>\n    Employees<span class=\"token punctuation\">.<\/span>Add<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">new<\/span> <span class=\"token class-name\">Employee<\/span>\n    <span class=\"token punctuation\">{<\/span>\n        FirstName <span class=\"token operator\">=<\/span> <span class=\"token string\">\"New\"<\/span><span class=\"token punctuation\">,<\/span>\n        LastName <span class=\"token operator\">=<\/span> <span class=\"token string\">\"Employee\"<\/span><span class=\"token punctuation\">,<\/span>\n        Department <span class=\"token operator\">=<\/span> <span class=\"token string\">\"Engineering\"<\/span><span class=\"token punctuation\">,<\/span>\n        Title <span class=\"token operator\">=<\/span> <span class=\"token string\">\"Developer\"<\/span><span class=\"token punctuation\">,<\/span>\n        HireDate <span class=\"token operator\">=<\/span> <span class=\"token class-name\">DateTime<\/span><span class=\"token punctuation\">.<\/span>Today<span class=\"token punctuation\">,<\/span>\n        Salary <span class=\"token operator\">=<\/span> <span class=\"token string\">80000m<\/span>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n\n<span class=\"token keyword\">private<\/span> <span class=\"token keyword\">void<\/span> RemoveEmployee_Click<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">object<\/span> sender<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">RoutedEventArgs<\/span> e<span class=\"token punctuation\">)<\/span>\n<span class=\"token punctuation\">{<\/span>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>editableGrid<span class=\"token punctuation\">.<\/span>SelectedItem <span class=\"token keyword\">is<\/span> <span class=\"token class-name\">Employee<\/span> emp<span class=\"token punctuation\">)<\/span>\n        Employees<span class=\"token punctuation\">.<\/span>Remove<span class=\"token punctuation\">(<\/span>emp<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<h3>The XAML<\/h3>\n<pre class=\"language-xml\"><code><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token tag\">DockPanel<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token tag\">StackPanel<\/span><\/span> <span class=\"token attr-name\">DockPanel.Dock<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"Top\"<\/span> <span class=\"token attr-name\">Orientation<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"Horizontal\"<\/span> <span class=\"token attr-name\">Margin<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"8\"<\/span><span class=\"token punctuation\">&gt;<\/span>\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token tag\">Button<\/span><\/span> <span class=\"token attr-name\">Content<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"Add Employee\"<\/span> <span class=\"token attr-name\">Click<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"AddEmployee_Click\"<\/span>\n                <span class=\"token attr-name\">Padding<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"12,6\"<\/span> <span class=\"token attr-name\">Margin<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"0,0,8,0\"<\/span> <span class=\"token punctuation\">\/&gt;<\/span>\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token tag\">Button<\/span><\/span> <span class=\"token attr-name\">Content<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"Remove Selected\"<\/span> <span class=\"token attr-name\">Click<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"RemoveEmployee_Click\"<\/span>\n                <span class=\"token attr-name\">Padding<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"12,6\"<\/span> <span class=\"token punctuation\">\/&gt;<\/span>\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span><span class=\"token tag\">StackPanel<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">DataGridControl<\/span><\/span> <span class=\"token attr-name\">x:Name<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"editableGrid\"<\/span>\n                          <span class=\"token attr-name\">ItemsSource<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"{Binding Employees}\"<\/span><span class=\"token punctuation\">&gt;<\/span>\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">DataGridControl.View<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n            <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">TableflowView<\/span><\/span> <span class=\"token attr-name\">IsAlternatingRowStyleEnabled<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"True\"<\/span><span class=\"token punctuation\">&gt;<\/span>\n                <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">TableflowView.Theme<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n                    <span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token namespace\">tp5<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">Windows10Theme<\/span><\/span> <span class=\"token punctuation\">\/&gt;<\/span>\n                <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">TableflowView.Theme<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n            <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">TableflowView<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n        <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">DataGridControl.View<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n    <span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span><span class=\"token namespace\">xcdg<\/span><span class=\"token punctuation\">:<\/span><span class=\"token tag\">DataGridControl<\/span><\/span><span class=\"token punctuation\">&gt;<\/span>\n<span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span><span class=\"token tag\">DockPanel<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/code><\/pre>\n<p>Click &#8220;Add Employee&#8221; and a new row appears at the bottom. Select a row and click &#8220;Remove Selected&#8221; \u2014 the row disappears instantly. You can also double-click any cell to edit it in place. Because Employee implements INotifyPropertyChanged, every cell edit propagates to the underlying object immediately. This is the same <strong>wpf datagrid binding<\/strong> pattern you&#8217;d use in an MVVM architecture \u2014 just move the collection and commands into a view model.<\/p>\n<h2>Pattern 4: Filter Data with DataGridCollectionView in Code<\/h2>\n<p>Filtering is where the built-in WPF DataGrid forces you into awkward territory. You either use CollectionViewSource.Filter with a predicate callback, or you rebuild the entire collection. Xceed&#8217;s DataGridCollectionView offers a cleaner approach through FilterCriterion objects.<\/p>\n<h3>The Setup<\/h3>\n<pre class=\"language-csharp\"><code><span class=\"token keyword\">private<\/span> <span class=\"token class-name\">DataGridCollectionView<\/span><span class=\"token punctuation\">?<\/span> <span class=\"token property\">_filteredView<\/span><span class=\"token punctuation\">;<\/span>\n\n<span class=\"token keyword\">private<\/span> <span class=\"token keyword\">void<\/span> SetupFilteredGrid<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\n<span class=\"token punctuation\">{<\/span>\n    <span class=\"token property\">_filteredView<\/span> <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">DataGridCollectionView<\/span><span class=\"token punctuation\">(<\/span>Employees<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n    filteredGrid<span class=\"token punctuation\">.<\/span>ItemsSource <span class=\"token operator\">=<\/span> <span class=\"token property\">_filteredView<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<h3>Applying a Filter<\/h3>\n<pre class=\"language-csharp\"><code><span class=\"token keyword\">private<\/span> <span class=\"token keyword\">void<\/span> FilterCombo_Changed<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">object<\/span> sender<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">SelectionChangedEventArgs<\/span> e<span class=\"token punctuation\">)<\/span>\n<span class=\"token punctuation\">{<\/span>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token property\">_filteredView<\/span> <span class=\"token operator\">==<\/span> <span class=\"token keyword\">null<\/span><span class=\"token punctuation\">)<\/span>\n        <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span>\n\n    <span class=\"token keyword\">string<\/span> dept <span class=\"token operator\">=<\/span> <span class=\"token comment\">\/* selected department from ComboBox *\/<\/span><span class=\"token punctuation\">;<\/span>\n    <span class=\"token property\">_filteredView<\/span><span class=\"token punctuation\">.<\/span>FilterCriteriaMode <span class=\"token operator\">=<\/span> <span class=\"token class-name\">FilterCriteriaMode<\/span><span class=\"token punctuation\">.<\/span>And<span class=\"token punctuation\">;<\/span>\n    <span class=\"token property\">_filteredView<\/span><span class=\"token punctuation\">.<\/span>ItemProperties<span class=\"token punctuation\">[<\/span><span class=\"token string\">\"Department\"<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>FilterCriterion <span class=\"token operator\">=<\/span> <span class=\"token keyword\">null<\/span><span class=\"token punctuation\">;<\/span>\n\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>dept <span class=\"token operator\">!=<\/span> <span class=\"token string\">\"All\"<\/span><span class=\"token punctuation\">)<\/span>\n    <span class=\"token punctuation\">{<\/span>\n        <span class=\"token property\">_filteredView<\/span><span class=\"token punctuation\">.<\/span>ItemProperties<span class=\"token punctuation\">[<\/span><span class=\"token string\">\"Department\"<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>FilterCriterion <span class=\"token operator\">=<\/span>\n            <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">EqualToFilterCriterion<\/span><span class=\"token punctuation\">(<\/span>dept<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n    <span class=\"token punctuation\">}<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>Set the criterion to null and all rows reappear. Set it to a specific value and the grid instantly filters. You can combine multiple FilterCriterion objects across different columns \u2014 use FilterCriteriaMode.And to require all criteria match, or FilterCriteriaMode.Or for any-match logic. The <strong>WPF DataGrid<\/strong> built into .NET has nothing comparable without writing custom predicate logic.<\/p>\n<p>EqualToFilterCriterion is one of several built-in options. Xceed also provides GreaterThanFilterCriterion, ContainsFilterCriterion, and others in the Xceed.Wpf.DataGrid.FilterCriteria namespace. For complex requirements, you can build composite filters with AndFilterCriterion and OrFilterCriterion.<\/p>\n<img decoding=\"async\" src=\"https:\/\/xceed.com\/wp-content\/uploads\/2026\/04\/04-filtered-binding.png\" alt=\"WPF DataGrid filtered by department using DataGridCollectionView\" \/>\n<h2>Which Pattern Should You Use?<\/h2>\n<p>The right choice depends on your requirements. However, most production apps combine several of these patterns.<\/p>\n<table>\n<thead>\n<tr>\n<th>Scenario<\/th>\n<th>Pattern<\/th>\n<th>Why<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Simple read-only list<\/td>\n<td>Pattern 1 \u2014 ObservableCollection<\/td>\n<td>Minimal setup, auto-generated columns<\/td>\n<\/tr>\n<tr>\n<td>Grouped reports<\/td>\n<td>Pattern 2 \u2014 DataGridCollectionViewSource<\/td>\n<td>Declarative grouping and sorting in XAML<\/td>\n<\/tr>\n<tr>\n<td>CRUD screens<\/td>\n<td>Pattern 3 \u2014 Live editing<\/td>\n<td>Two-way binding with add\/remove support<\/td>\n<\/tr>\n<tr>\n<td>Search or filter UI<\/td>\n<td>Pattern 4 \u2014 FilterCriterion<\/td>\n<td>Type-safe filtering without custom predicates<\/td>\n<\/tr>\n<tr>\n<td>All of the above<\/td>\n<td>Combine patterns 2 + 3 + 4<\/td>\n<td>DataGridCollectionView supports all three simultaneously<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>For a quick prototype, Pattern 1 gets you running in under a minute \u2014 it&#8217;s the simplest <strong>wpf datagrid example<\/strong> to copy and adapt. For anything destined for production, start with DataGridCollectionView (Pattern 4) because you can always layer grouping and sorting on top later.<\/p>\n<h2>Why Not Just Use the Built-In DataGrid?<\/h2>\n<p>The standard <strong>WPF DataGrid<\/strong> that ships with .NET works for basic tables. Nevertheless, it hasn&#8217;t received a feature update since 2010. Here&#8217;s where Xceed pulls ahead specifically for binding scenarios:<\/p>\n<ul>\n<li><strong>DataGridCollectionView<\/strong> replaces the clunky ICollectionView pattern with purpose-built grouping, sorting, and filtering<\/li>\n<li><strong>Container recycling<\/strong> keeps memory flat even when binding collections with millions of rows<\/li>\n<li><strong>Smooth scrolling<\/strong> through TableflowView makes large bound datasets feel responsive<\/li>\n<li><strong>18 built-in themes<\/strong> eliminate the need for custom DataGrid styling<\/li>\n<li><strong>Master-detail binding<\/strong> works through DataRelation objects \u2014 no manual templates required<\/li>\n<\/ul>\n<p>The built-in DataGrid can technically do grouping and filtering, but you&#8217;ll write significantly more boilerplate code. Xceed wraps these patterns into a cohesive API that works consistently across all four patterns shown above.<\/p>\n<h2>Get the Demo Project<\/h2>\n<p>The complete <a href=\"https:\/\/github.com\/xceedsoftware\/wpftoolkit\">XceedDataGridBindingDemo<\/a> project includes all four patterns in a tabbed interface. Clone the repo, restore NuGet packages, and run it on .NET 10:<\/p>\n<pre class=\"language-xml\"><code><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token tag\">PackageReference<\/span><\/span> <span class=\"token attr-name\">Include<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"Xceed.Products.Wpf.DataGrid.Full\"<\/span>\n                  <span class=\"token attr-name\">Version<\/span><span class=\"token punctuation\">=<\/span><span class=\"token attr-value\">\"7.3.26166.7869\"<\/span> <span class=\"token punctuation\">\/&gt;<\/span><\/code><\/pre>\n<p>Every XAML and C# snippet in this article comes directly from that demo. Insert your license key in App.xaml.cs before running \u2014 or use the 45-day trial with no key at all.<\/p>\n<div class=\"cta-box\">\n<h3>Try Xceed DataGrid for WPF<\/h3>\n<p>Bind, group, filter, and edit millions of rows with smooth scrolling and 18 built-in themes. One NuGet package, zero custom plumbing.<\/p>\n<a class=\"cta-link\" href=\"https:\/\/xceed.com\/products\/wpf\/datagrid-for-wpf\/\">Download Free Trial<\/a> <a class=\"cta-link\" href=\"https:\/\/www.nuget.org\/packages\/Xceed.Products.Wpf.DataGrid.Full\">View on NuGet<\/a><\/div>\n<h3>Is the WPF DataGrid still used in 2026?<\/h3>\n<p>Yes \u2014 WPF ships with every .NET release including .NET 10, and Microsoft uses Xceed&#8217;s <strong>WPF DataGrid<\/strong> in Visual Studio itself. WPF remains the standard for data-heavy desktop apps on Windows, especially in finance, healthcare, and manufacturing.<\/p>\n<h3>What is the difference between DataGrid and DataGridControl in WPF?<\/h3>\n<p>DataGrid is the built-in control from Microsoft, included in the System.Windows.Controls namespace. DataGridControl is Xceed&#8217;s replacement, offering TableflowView, built-in grouping, smooth scrolling, and 18 themes. Both support <strong>wpf datagrid binding<\/strong> to collections, but DataGridControl provides a richer API for production use.<\/p>\n<h3>How do I bind a WPF DataGrid to a list of objects?<\/h3>\n<p>Set the ItemsSource property to any IEnumerable, ideally an ObservableCollection. For the best experience, implement INotifyPropertyChanged on your model class so cell edits update automatically. This <strong>wpf datagrid example<\/strong> pattern works identically with both the built-in DataGrid and Xceed&#8217;s DataGridControl.<\/p>\n<h3>Can I group and filter a WPF DataGrid without code-behind?<\/h3>\n<p>With Xceed, yes. Use DataGridCollectionViewSource in your XAML resources and add DataGridGroupDescription entries for grouping. Sorting works through standard SortDescription objects. Filtering requires a small amount of code-behind or view model logic, since filter criteria depend on runtime values.<\/p>\n<h3>How do I handle millions of rows in a WPF DataGrid?<\/h3>\n<p>The built-in <strong>WPF DataGrid<\/strong> struggles beyond 100,000 rows due to limited virtualization. Xceed DataGrid provides UI virtualization with container recycling, asynchronous data virtualization, and column virtualization \u2014 handling millions of rows without memory spikes. Bind your large dataset normally and the grid manages paging internally.<\/p>\n<h3>Does Xceed DataGrid work with MVVM?<\/h3>\n<p>Absolutely. Expose your ObservableCollection and DataGridCollectionView from a view model, bind ItemsSource in XAML, and use ICommand for add\/remove operations. Every <strong>wpf datagrid binding<\/strong> pattern shown in this article translates directly to MVVM \u2014 just replace the code-behind event handlers with commands.<\/p>\n<\/section>\n<\/article>\n<p><script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Is the WPF DataGrid still used in 2026?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes \u2014 WPF ships with every .NET release including .NET 10, and Microsoft uses Xceed's WPF DataGrid in Visual Studio itself. WPF remains the standard for data-heavy desktop apps on Windows, especially in finance, healthcare, and manufacturing.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What is the difference between DataGrid and DataGridControl in WPF?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"DataGrid is the built-in control from Microsoft, included in the System.Windows.Controls namespace. DataGridControl is Xceed's replacement, offering TableflowView, built-in grouping, smooth scrolling, and 18 themes. Both support wpf datagrid binding to collections, but DataGridControl provides a richer API for production use.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How do I bind a WPF DataGrid to a list of objects?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Set the ItemsSource property to any IEnumerable, ideally an ObservableCollection. For the best experience, implement INotifyPropertyChanged on your model class so cell edits update automatically. This wpf datagrid example pattern works identically with both the built-in DataGrid and Xceed's DataGridControl.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Can I group and filter a WPF DataGrid without code-behind?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"With Xceed, yes. Use DataGridCollectionViewSource in your XAML resources and add DataGridGroupDescription entries for grouping. Sorting works through standard SortDescription objects. Filtering requires a small amount of code-behind or view model logic, since filter criteria depend on runtime values.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How do I handle millions of rows in a WPF DataGrid?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"The built-in WPF DataGrid struggles beyond 100,000 rows due to limited virtualization. Xceed DataGrid provides UI virtualization with container recycling, asynchronous data virtualization, and column virtualization \u2014 handling millions of rows without memory spikes. Bind your large dataset normally and the grid manages paging internally.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Does Xceed DataGrid work with MVVM?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Absolutely. Expose your ObservableCollection and DataGridCollectionView from a view model, bind ItemsSource in XAML, and use ICommand for add\/remove operations. Every wpf datagrid binding pattern shown in this article translates directly to MVVM \u2014 just replace the code-behind event handlers with commands.\"\n      }\n    }\n  ]\n}\n<\/script> <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/prism\/1.29.0\/prism.min.js\"><\/script> <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/prism\/1.29.0\/components\/prism-csharp.min.js\"><\/script> <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/prism\/1.29.0\/components\/prism-markup.min.js\"><\/script><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>The built-in WPF DataGrid handles simple binding well enough, but grouping, filtering, and real-time updates require serious plumbing. This guide shows you four binding patterns that actually work in production \u2014 with a runnable Xceed DataGrid demo on .NET 10.<\/p>","protected":false},"author":17,"featured_media":3611,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[141,60],"tags":[599,451,777,781,780,72,240,778,779,275],"class_list":["post-3602","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-all","category-tutorials","tag-net-10","tag-c","tag-data-binding","tag-datagridcollectionview","tag-observablecollection","tag-wpf","tag-wpf-datagrid","tag-wpf-tutorial","tag-xaml","tag-xceed-datagrid"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>WPF DataGrid Binding in C#: 4 Patterns Every Developer Should Know - Xceed<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/xceed.com\/fr\/blog\/tutoriels\/wpf-datagrid-binding-guide\/\" \/>\n<meta property=\"og:locale\" content=\"fr_CA\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"WPF DataGrid Binding in C#: 4 Patterns Every Developer Should Know - Xceed\" \/>\n<meta property=\"og:description\" content=\"The built-in WPF DataGrid handles simple binding well enough, but grouping, filtering, and real-time updates require serious plumbing. This guide shows you four binding patterns that actually work in production \u2014 with a runnable Xceed DataGrid demo on .NET 10.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/xceed.com\/fr\/blog\/tutoriels\/wpf-datagrid-binding-guide\/\" \/>\n<meta property=\"og:site_name\" content=\"Xceed\" \/>\n<meta property=\"article:published_time\" content=\"2026-04-02T23:41:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-03T00:23:18+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/xceed.com\/wp-content\/uploads\/2026\/04\/xceed_blog_binding.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1536\" \/>\n\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Technical Writer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Technical Writer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/xceed.com\\\/blog\\\/tutorials\\\/wpf-datagrid-binding-guide\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/xceed.com\\\/blog\\\/tutorials\\\/wpf-datagrid-binding-guide\\\/\"},\"author\":{\"name\":\"Technical Writer\",\"@id\":\"https:\\\/\\\/xceed.com\\\/fr\\\/#\\\/schema\\\/person\\\/66fdfcd0d8aba59714ee8630310915bc\"},\"headline\":\"WPF DataGrid Binding in C#: 4 Patterns Every Developer Should Know\",\"datePublished\":\"2026-04-02T23:41:26+00:00\",\"dateModified\":\"2026-04-03T00:23:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/xceed.com\\\/blog\\\/tutorials\\\/wpf-datagrid-binding-guide\\\/\"},\"wordCount\":1277,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/xceed.com\\\/fr\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/xceed.com\\\/blog\\\/tutorials\\\/wpf-datagrid-binding-guide\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/xceed.com\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/xceed_blog_binding.png\",\"keywords\":[\".NET 10\",\"C#\",\"data binding\",\"DataGridCollectionView\",\"ObservableCollection\",\"WPF\",\"WPF DataGrid\",\"WPF tutorial\",\"XAML\",\"Xceed DataGrid\"],\"articleSection\":[\"All\",\"Tutorials\"],\"inLanguage\":\"fr-CA\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/xceed.com\\\/blog\\\/tutorials\\\/wpf-datagrid-binding-guide\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/xceed.com\\\/blog\\\/tutorials\\\/wpf-datagrid-binding-guide\\\/\",\"url\":\"https:\\\/\\\/xceed.com\\\/blog\\\/tutorials\\\/wpf-datagrid-binding-guide\\\/\",\"name\":\"WPF DataGrid Binding in C#: 4 Patterns Every Developer Should Know - Xceed\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/xceed.com\\\/fr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/xceed.com\\\/blog\\\/tutorials\\\/wpf-datagrid-binding-guide\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/xceed.com\\\/blog\\\/tutorials\\\/wpf-datagrid-binding-guide\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/xceed.com\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/xceed_blog_binding.png\",\"datePublished\":\"2026-04-02T23:41:26+00:00\",\"dateModified\":\"2026-04-03T00:23:18+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/xceed.com\\\/blog\\\/tutorials\\\/wpf-datagrid-binding-guide\\\/#breadcrumb\"},\"inLanguage\":\"fr-CA\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/xceed.com\\\/blog\\\/tutorials\\\/wpf-datagrid-binding-guide\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-CA\",\"@id\":\"https:\\\/\\\/xceed.com\\\/blog\\\/tutorials\\\/wpf-datagrid-binding-guide\\\/#primaryimage\",\"url\":\"https:\\\/\\\/xceed.com\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/xceed_blog_binding.png\",\"contentUrl\":\"https:\\\/\\\/xceed.com\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/xceed_blog_binding.png\",\"width\":1536,\"height\":1024},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/xceed.com\\\/blog\\\/tutorials\\\/wpf-datagrid-binding-guide\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/xceed.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WPF DataGrid Binding in C#: 4 Patterns Every Developer Should Know\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/xceed.com\\\/fr\\\/#website\",\"url\":\"https:\\\/\\\/xceed.com\\\/fr\\\/\",\"name\":\"Xceed\",\"description\":\"Provides tools for .NET, Windows Forms, WPF, Silverlight, and ASP.NET developers to create better applications.\",\"publisher\":{\"@id\":\"https:\\\/\\\/xceed.com\\\/fr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/xceed.com\\\/fr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-CA\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/xceed.com\\\/fr\\\/#organization\",\"name\":\"Xceed\",\"url\":\"https:\\\/\\\/xceed.com\\\/fr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-CA\",\"@id\":\"https:\\\/\\\/xceed.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/xceed.com\\\/wp-content\\\/uploads\\\/2024\\\/04\\\/cropped-xceed-logo.png\",\"contentUrl\":\"https:\\\/\\\/xceed.com\\\/wp-content\\\/uploads\\\/2024\\\/04\\\/cropped-xceed-logo.png\",\"width\":609,\"height\":150,\"caption\":\"Xceed\"},\"image\":{\"@id\":\"https:\\\/\\\/xceed.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/xceed.com\\\/fr\\\/#\\\/schema\\\/person\\\/66fdfcd0d8aba59714ee8630310915bc\",\"name\":\"Technical Writer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-CA\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0030bb8372562c953cb6409907492d051e06b7c67c4161b4a7efde2ecaff4201?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0030bb8372562c953cb6409907492d051e06b7c67c4161b4a7efde2ecaff4201?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0030bb8372562c953cb6409907492d051e06b7c67c4161b4a7efde2ecaff4201?s=96&d=mm&r=g\",\"caption\":\"Technical Writer\"},\"url\":\"https:\\\/\\\/xceed.com\\\/fr\\\/blog\\\/author\\\/technicalwriter\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"WPF DataGrid Binding in C#: 4 Patterns Every Developer Should Know - Xceed","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/xceed.com\/fr\/blog\/tutoriels\/wpf-datagrid-binding-guide\/","og_locale":"fr_CA","og_type":"article","og_title":"WPF DataGrid Binding in C#: 4 Patterns Every Developer Should Know - Xceed","og_description":"The built-in WPF DataGrid handles simple binding well enough, but grouping, filtering, and real-time updates require serious plumbing. This guide shows you four binding patterns that actually work in production \u2014 with a runnable Xceed DataGrid demo on .NET 10.","og_url":"https:\/\/xceed.com\/fr\/blog\/tutoriels\/wpf-datagrid-binding-guide\/","og_site_name":"Xceed","article_published_time":"2026-04-02T23:41:26+00:00","article_modified_time":"2026-04-03T00:23:18+00:00","og_image":[{"width":1536,"height":1024,"url":"https:\/\/xceed.com\/wp-content\/uploads\/2026\/04\/xceed_blog_binding.png","type":"image\/png"}],"author":"Technical Writer","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Technical Writer","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/xceed.com\/blog\/tutorials\/wpf-datagrid-binding-guide\/#article","isPartOf":{"@id":"https:\/\/xceed.com\/blog\/tutorials\/wpf-datagrid-binding-guide\/"},"author":{"name":"Technical Writer","@id":"https:\/\/xceed.com\/fr\/#\/schema\/person\/66fdfcd0d8aba59714ee8630310915bc"},"headline":"WPF DataGrid Binding in C#: 4 Patterns Every Developer Should Know","datePublished":"2026-04-02T23:41:26+00:00","dateModified":"2026-04-03T00:23:18+00:00","mainEntityOfPage":{"@id":"https:\/\/xceed.com\/blog\/tutorials\/wpf-datagrid-binding-guide\/"},"wordCount":1277,"commentCount":0,"publisher":{"@id":"https:\/\/xceed.com\/fr\/#organization"},"image":{"@id":"https:\/\/xceed.com\/blog\/tutorials\/wpf-datagrid-binding-guide\/#primaryimage"},"thumbnailUrl":"https:\/\/xceed.com\/wp-content\/uploads\/2026\/04\/xceed_blog_binding.png","keywords":[".NET 10","C#","data binding","DataGridCollectionView","ObservableCollection","WPF","WPF DataGrid","WPF tutorial","XAML","Xceed DataGrid"],"articleSection":["All","Tutorials"],"inLanguage":"fr-CA","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/xceed.com\/blog\/tutorials\/wpf-datagrid-binding-guide\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/xceed.com\/blog\/tutorials\/wpf-datagrid-binding-guide\/","url":"https:\/\/xceed.com\/blog\/tutorials\/wpf-datagrid-binding-guide\/","name":"WPF DataGrid Binding in C#: 4 Patterns Every Developer Should Know - Xceed","isPartOf":{"@id":"https:\/\/xceed.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/xceed.com\/blog\/tutorials\/wpf-datagrid-binding-guide\/#primaryimage"},"image":{"@id":"https:\/\/xceed.com\/blog\/tutorials\/wpf-datagrid-binding-guide\/#primaryimage"},"thumbnailUrl":"https:\/\/xceed.com\/wp-content\/uploads\/2026\/04\/xceed_blog_binding.png","datePublished":"2026-04-02T23:41:26+00:00","dateModified":"2026-04-03T00:23:18+00:00","breadcrumb":{"@id":"https:\/\/xceed.com\/blog\/tutorials\/wpf-datagrid-binding-guide\/#breadcrumb"},"inLanguage":"fr-CA","potentialAction":[{"@type":"ReadAction","target":["https:\/\/xceed.com\/blog\/tutorials\/wpf-datagrid-binding-guide\/"]}]},{"@type":"ImageObject","inLanguage":"fr-CA","@id":"https:\/\/xceed.com\/blog\/tutorials\/wpf-datagrid-binding-guide\/#primaryimage","url":"https:\/\/xceed.com\/wp-content\/uploads\/2026\/04\/xceed_blog_binding.png","contentUrl":"https:\/\/xceed.com\/wp-content\/uploads\/2026\/04\/xceed_blog_binding.png","width":1536,"height":1024},{"@type":"BreadcrumbList","@id":"https:\/\/xceed.com\/blog\/tutorials\/wpf-datagrid-binding-guide\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/xceed.com\/"},{"@type":"ListItem","position":2,"name":"WPF DataGrid Binding in C#: 4 Patterns Every Developer Should Know"}]},{"@type":"WebSite","@id":"https:\/\/xceed.com\/fr\/#website","url":"https:\/\/xceed.com\/fr\/","name":"Xceed","description":"Fournit des outils aux d\u00e9veloppeurs .NET, Windows Forms, WPF, Silverlight et ASP.NET pour cr\u00e9er de meilleures applications.","publisher":{"@id":"https:\/\/xceed.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/xceed.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-CA"},{"@type":"Organization","@id":"https:\/\/xceed.com\/fr\/#organization","name":"Xceed","url":"https:\/\/xceed.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-CA","@id":"https:\/\/xceed.com\/fr\/#\/schema\/logo\/image\/","url":"https:\/\/xceed.com\/wp-content\/uploads\/2024\/04\/cropped-xceed-logo.png","contentUrl":"https:\/\/xceed.com\/wp-content\/uploads\/2024\/04\/cropped-xceed-logo.png","width":609,"height":150,"caption":"Xceed"},"image":{"@id":"https:\/\/xceed.com\/fr\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/xceed.com\/fr\/#\/schema\/person\/66fdfcd0d8aba59714ee8630310915bc","name":"Technical Writer","image":{"@type":"ImageObject","inLanguage":"fr-CA","@id":"https:\/\/secure.gravatar.com\/avatar\/0030bb8372562c953cb6409907492d051e06b7c67c4161b4a7efde2ecaff4201?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/0030bb8372562c953cb6409907492d051e06b7c67c4161b4a7efde2ecaff4201?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0030bb8372562c953cb6409907492d051e06b7c67c4161b4a7efde2ecaff4201?s=96&d=mm&r=g","caption":"Technical Writer"},"url":"https:\/\/xceed.com\/fr\/blog\/author\/technicalwriter\/"}]}},"_links":{"self":[{"href":"https:\/\/xceed.com\/fr\/wp-json\/wp\/v2\/posts\/3602","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/xceed.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/xceed.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/xceed.com\/fr\/wp-json\/wp\/v2\/users\/17"}],"replies":[{"embeddable":true,"href":"https:\/\/xceed.com\/fr\/wp-json\/wp\/v2\/comments?post=3602"}],"version-history":[{"count":0,"href":"https:\/\/xceed.com\/fr\/wp-json\/wp\/v2\/posts\/3602\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/xceed.com\/fr\/wp-json\/wp\/v2\/media\/3611"}],"wp:attachment":[{"href":"https:\/\/xceed.com\/fr\/wp-json\/wp\/v2\/media?parent=3602"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/xceed.com\/fr\/wp-json\/wp\/v2\/categories?post=3602"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/xceed.com\/fr\/wp-json\/wp\/v2\/tags?post=3602"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}