<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Syncfusion, Inc.</title>
    <description>The latest articles on DEV Community by Syncfusion, Inc. (syncfusion).</description>
    <link>https://dev.to/syncfusion</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F771%2F21df7034-5069-4e05-9f54-2c881bb9ebb7.png</url>
      <title>DEV Community: Syncfusion, Inc.</title>
      <link>https://dev.to/syncfusion</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/syncfusion"/>
    <language>en</language>
    <item>
      <title>Less Custom Code, Smarter Scheduling: What’s New in Pure React Scheduler 2026 Volume 2</title>
      <dc:creator>Lucy Muturi</dc:creator>
      <pubDate>Mon, 13 Jul 2026 11:11:03 +0000</pubDate>
      <link>https://dev.to/syncfusion/less-custom-code-smarter-scheduling-whats-new-in-pure-react-scheduler-2026-volume-2-2hml</link>
      <guid>https://dev.to/syncfusion/less-custom-code-smarter-scheduling-whats-new-in-pure-react-scheduler-2026-volume-2-2hml</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Essential Studio 2026 Volume 2 brings powerful updates to the Pure React Scheduler, including a mobile-friendly Agenda View, time zone support, load-on-demand data loading, resource grouping, and recurring event management. These enhancements help developers build faster, more scalable scheduling applications with less custom code.&lt;/p&gt;

&lt;p&gt;Scheduling is one of those features that looks simple at first glance. In reality, once you start dealing with recurring appointments, multiple resources, users across different time zones, or thousands of events, things become significantly more challenging.&lt;/p&gt;

&lt;p&gt;The latest enhancements in the Syncfusion&lt;sup&gt;®&lt;/sup&gt; &lt;a href="https://www.syncfusion.com/react-components/scheduler" rel="noopener noreferrer"&gt;Pure React Scheduler&lt;/a&gt; component are designed to simplify these challenges. Whether you’re building an appointment booking platform, a healthcare scheduling system, a workforce management solution, or an educational calendar application, these updates help reduce custom development effort while improving scalability, usability, and performance.&lt;/p&gt;

&lt;p&gt;Let’s explore what’s new in the &lt;a href="https://www.syncfusion.com/forums/198475/essential-studio-2026-volume-2-main-release-v34-1-29-is-available-for-download" rel="noopener noreferrer"&gt;Essential Studio 2026 Volume 2&lt;/a&gt; release for the &lt;a href="https://react.syncfusion.com/react-ui/scheduler/overview/?theme=material" rel="noopener noreferrer"&gt;Pure React Scheduler&lt;/a&gt; and see how these additions can help you create scheduling experiences that are easier to maintain, perform well at scale, and deliver a better experience for users.&lt;/p&gt;

&lt;h2&gt;
  
  
  See upcoming events faster with agenda view
&lt;/h2&gt;

&lt;p&gt;Traditional calendar layouts work well on large screens, but they can become difficult to navigate on mobile devices or when multiple appointments overlap. Finding the next event often requires zooming, scrolling, or switching between views.&lt;/p&gt;

&lt;p&gt;The new &lt;a href="https://react.syncfusion.com/react-ui/scheduler/agenda-view/?theme=material" rel="noopener noreferrer"&gt;agenda view&lt;/a&gt; takes a different approach by presenting upcoming appointments as a clean, date-grouped list. Events are arranged chronologically, making it easy to scan what’s coming next without the visual complexity of a traditional calendar grid.&lt;/p&gt;

&lt;p&gt;This view is especially useful when users care more about event details than calendar placement.&lt;/p&gt;

&lt;h3&gt;
  
  
  Designed for everyday scheduling
&lt;/h3&gt;

&lt;p&gt;If you’ve built mobile scheduling screens before, you’ve likely encountered situations where a month or week view becomes cluttered. Agenda view solves that problem by prioritizing readability.&lt;/p&gt;

&lt;p&gt;A healthcare application, for example, can display a doctor’s appointments for the day in a simple schedule. Likewise, a sales manager can quickly review meetings without navigating between multiple calendar views.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why you’ll appreciate it
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Optimized for mobile screens and compact layouts.&lt;/li&gt;
&lt;li&gt;Displays upcoming events clearly with full details.&lt;/li&gt;
&lt;li&gt;Displays appointments in chronological order, grouped by date and sorted by time.&lt;/li&gt;
&lt;li&gt;Makes overlapping events easier to review.&lt;/li&gt;
&lt;li&gt;Supports configurable date ranges to view single or multiple days.&lt;/li&gt;
&lt;li&gt;Supports recurring events seamlessly.&lt;/li&gt;
&lt;li&gt;Includes full keyboard accessibility support.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;App.tsx&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Scheduler&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;EventSettings&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;AgendaView&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@syncfusion/react-scheduler&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;fifaEventData&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./dataSource&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="c1"&gt;//Event data imported from the data source file.&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;eventSettings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;EventSettings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;dataSource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;fifaEventData&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Scheduler&lt;/span&gt;
            &lt;span class="nx"&gt;defaultSelectedDate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
            &lt;span class="nx"&gt;eventSettings&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;eventSettings&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AgendaView&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Scheduler&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Refer to the following image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FAgenda-view-in-Pure-React-Scheduler.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FAgenda-view-in-Pure-React-Scheduler.png" alt="Agenda view in Pure React Scheduler" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Agenda view in Pure React Scheduler
  &lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Schedule confidently across time zones
&lt;/h2&gt;

&lt;p&gt;Time zones seem straightforward until users begin joining events from different regions. Hard-coded conversions and custom date calculations can quickly become difficult to maintain.&lt;/p&gt;

&lt;p&gt;The Scheduler now supports both &lt;a href="https://react.syncfusion.com/react-ui/scheduler/timezone/?theme=material" rel="noopener noreferrer"&gt;global scheduler-level time zones and appointment-specific time zones&lt;/a&gt;, ensuring events display accurately regardless of users’ locations.&lt;/p&gt;

&lt;p&gt;Once configured, time conversions happen automatically, reducing the amount of custom logic developers need to implement.&lt;/p&gt;

&lt;h3&gt;
  
  
  A practical example
&lt;/h3&gt;

&lt;p&gt;Imagine a product team scheduling a meeting from &lt;strong&gt;New York&lt;/strong&gt; while participants join from &lt;strong&gt;London, Singapore,&lt;/strong&gt; and &lt;strong&gt;Sydney.&lt;/strong&gt; Each attendee sees the meeting in their local time without any manual conversion.&lt;/p&gt;

&lt;p&gt;This removes one of the most common sources of scheduling mistakes in distributed teams.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does this simplify?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Automatically converts appointments between time zones.&lt;/li&gt;
&lt;li&gt;Displays accurate start and end times for users worldwide.&lt;/li&gt;
&lt;li&gt;Reduces scheduling confusion across regions.&lt;/li&gt;
&lt;li&gt;Supports both scheduler-wide and appointment-level configurations.&lt;/li&gt;
&lt;li&gt;Simplifies global application development.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;App.tsx&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Scheduler&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;DayView&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;EventSettings&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;MonthView&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;WeekView&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@syncfusion/react-scheduler&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;fifaEventData&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./dataSource&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;timezone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;UTC&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;eventSettings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;EventSettings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;dataSource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;fifaEventData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
   &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Scheduler&lt;/span&gt;
      &lt;span class="nx"&gt;defaultSelectedDate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
      &lt;span class="nx"&gt;eventSettings&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;eventSettings&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nx"&gt;timezone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
     &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;DayView&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;WeekView&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MonthView&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Scheduler&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FPure-React-Scheduler-displaying-different-time-zone-options.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FPure-React-Scheduler-displaying-different-time-zone-options.png" alt="Pure React Scheduler displaying different time zone options" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Pure React Scheduler displaying different time zone options
  &lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep large schedules responsive with load-on-demand
&lt;/h2&gt;

&lt;p&gt;As scheduling applications grow, performance can quickly become a challenge. Loading large volumes of appointments upfront increases payload size, slows rendering, and consumes unnecessary resources.&lt;/p&gt;

&lt;p&gt;The new &lt;strong&gt;load-on-demand&lt;/strong&gt; capability solves this by loading only the events needed for the currently visible date range. As users navigate between dates and views, the Scheduler fetches only the relevant data, keeping the experience fast and responsive.&lt;/p&gt;

&lt;h3&gt;
  
  
  Two ways to implement it
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Manual data loading with onDataRequest
&lt;/h4&gt;

&lt;p&gt;The &lt;strong&gt;&lt;code&gt;onDataRequest&lt;/code&gt;&lt;/strong&gt; event provides the active view’s start and end dates, allowing you to fetch and return only the events within that range.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Automatic loading with DataManager
&lt;/h4&gt;

&lt;p&gt;The Syncfusion &lt;strong&gt;&lt;code&gt;DataManager&lt;/code&gt;&lt;/strong&gt; can automatically handle data requests during navigation, view changes, and CRUD actions. It sends the active date range to the server, enabling efficient server-side filtering.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real-world use case
&lt;/h3&gt;

&lt;p&gt;Consider a university scheduling system containing thousands of classes across multiple departments. Instead of loading the entire schedule, only the events for the current week or month are retrieved, helping the UI remain responsive as data grows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance benefits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Reduces API payload sizes.&lt;/li&gt;
&lt;li&gt;Improves rendering speed.&lt;/li&gt;
&lt;li&gt;Minimizes memory usage.&lt;/li&gt;
&lt;li&gt;Handles large datasets efficiently.&lt;/li&gt;
&lt;li&gt;Delivers a faster, more responsive user experience.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;App.tsx&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;WeekView&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Scheduler&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;EventSettings&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@syncfusion/react-scheduler&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;DataManager&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;WebApiAdaptor&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@syncfusion/react-data&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;DataManager&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://ej2services.syncfusion.com/react/hotfix/api/schedule&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;adaptor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WebApiAdaptor&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="na"&gt;crossDomain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;

        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;eventSettings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;EventSettings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;dataSource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
           &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Scheduler&lt;/span&gt; &lt;span class="nx"&gt;eventSettings&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;eventSettings&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;WeekView&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Scheduler&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;           &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read the full blog post on the &lt;a href="https://www.syncfusion.com/blogs/post/pure-react-scheduler-2026-volume-2" rel="noopener noreferrer"&gt;Syncfusion Website&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>essentialstudio</category>
      <category>javascript</category>
      <category>purereact</category>
    </item>
    <item>
      <title>Building Smarter .NET MAUI Apps? See What’s New in Syncfusion 2026 Volume 2</title>
      <dc:creator>Lucy Muturi</dc:creator>
      <pubDate>Fri, 10 Jul 2026 15:45:05 +0000</pubDate>
      <link>https://dev.to/syncfusion/building-smarter-net-maui-apps-see-whats-new-in-syncfusion-2026-volume-2-5a2m</link>
      <guid>https://dev.to/syncfusion/building-smarter-net-maui-apps-see-whats-new-in-syncfusion-2026-volume-2-5a2m</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; The 2026 Volume 2 release brings major enhancements to .NET MAUI, including multi-agent AI AssistView experiences, conversation management, advanced chart visualization, DataGrid productivity improvements, built-in filtering, and TreeView checkbox support. These updates help you build more intelligent, data-driven, and user-friendly cross-platform applications with less custom code and better user experiences.&lt;/p&gt;

&lt;p&gt;Modern applications are evolving rapidly, with growing demand for AI-powered experiences, interactive data visualization, and productivity-focused user interfaces. To help you meet these expectations, the Essential Studio&lt;sup&gt;® &lt;/sup&gt;&lt;a href="https://help.syncfusion.com/common/essential-studio/release-notes/v34.1.29" rel="noopener noreferrer"&gt;2026 Volume 2&lt;/a&gt; release for .NET MAUI introduces enhancements across AI experiences, data management, and visualization.&lt;/p&gt;

&lt;p&gt;This release brings new capabilities that make it easier to build intelligent applications, work with data more effectively, and deliver richer user experiences. From improved AI interactions and conversation management to enhanced charting and productivity-focused data features, these updates help you create modern cross-platform applications with less effort.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="132"&gt;&lt;strong&gt;&amp;nbsp;Area&lt;/strong&gt;&lt;/td&gt;
&lt;td width="492"&gt;&lt;strong&gt;&amp;nbsp;Highlights&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="132"&gt;&amp;nbsp;&lt;a title=".NET MAUI AI AssistView" href="https://www.syncfusion.com/maui-controls/maui-ai-assistview" rel="noopener noreferrer"&gt;AI AssistView&lt;/a&gt;
&lt;/td&gt;
&lt;td width="492"&gt;&amp;nbsp;Multi-agent support, conversation management, and chat experience enhancements.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="132"&gt;&amp;nbsp;&lt;a title=".NET MAUI Cartesian Charts" href="https://www.syncfusion.com/maui-controls/maui-cartesian-charts/chart-types" rel="noopener noreferrer"&gt;Cartesian Charts&lt;/a&gt;
&lt;/td&gt;
&lt;td width="492"&gt;&amp;nbsp;Point color mapping and multilevel labels.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="132"&gt;&amp;nbsp;&lt;a title=".NET MAUI DataGrid" href="https://www.syncfusion.com/maui-controls/maui-datagrid" rel="noopener noreferrer"&gt;DataGrid&lt;/a&gt;
&lt;/td&gt;
&lt;td width="492"&gt;&amp;nbsp;Multi-row dragging, built-in search, and undo/redo operations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="132"&gt;&amp;nbsp;&lt;a title=".NET MAUI ListView" href="https://www.syncfusion.com/maui-controls/maui-listview" rel="noopener noreferrer"&gt;ListView&lt;/a&gt;
&lt;/td&gt;
&lt;td width="492"&gt;&amp;nbsp;Built-in filtering UI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="132"&gt;&amp;nbsp;&lt;a title=".NET MAUI TreeView" href="https://www.syncfusion.com/maui-controls/maui-treeview" rel="noopener noreferrer"&gt;TreeView&lt;/a&gt;
&lt;/td&gt;
&lt;td width="492"&gt;&amp;nbsp;Easier hierarchical item selection&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Let’s explore the highlights of the 2026 Volume 2 release.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI AssistView
&lt;/h2&gt;

&lt;p&gt;AI-powered applications continue to evolve, and this release expands &lt;a href="https://www.syncfusion.com/maui-controls/maui-ai-assistview" rel="noopener noreferrer"&gt;AI AssistView&lt;/a&gt; with features that make it easier than ever to build sophisticated conversational experiences.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agent picker
&lt;/h3&gt;

&lt;p&gt;Today’s applications often rely on multiple AI agents, each tailored for a specific task such as document summarization, coding assistance, customer support, or translation. With the new Agent Picker, users can switch between agents directly from the prompt editor without interrupting their workflow.&lt;/p&gt;

&lt;p&gt;The selected agent appears as a compact chip with an icon and label, making it easy to identify the active assistant at a glance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FAgent-Picker-in-AI-AssistView.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FAgent-Picker-in-AI-AssistView.gif" alt="Agent Picker support in AI AssistView" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Agent Picker support in AI AssistView
  &lt;p&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conversation management
&lt;/h3&gt;

&lt;p&gt;As AI applications grow, managing conversations becomes just as important as generating responses. The new Conversation Management support enables developers to provide a dedicated conversation panel where users can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pin important conversations&lt;/li&gt;
&lt;li&gt;Rename chats for easier identification&lt;/li&gt;
&lt;li&gt;Filter conversations&lt;/li&gt;
&lt;li&gt;Remove conversations that are no longer needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates a familiar experience similar to modern AI chat platforms while keeping conversation history organized and accessible.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FConversation-Management-in-AI-AssistView-1.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FConversation-Management-in-AI-AssistView-1.gif" alt="Conversation Management support in AI AssistView" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Conversation Management support in AI AssistView
  &lt;p&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  AI chat experience enhancements
&lt;/h3&gt;

&lt;p&gt;Several usability improvements have also been added to make AI interactions more seamless:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Image Preview&lt;/strong&gt; allows users to open attached images in a larger view for easier inspection of screenshots, diagrams, and other visual content.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FImage-Preview-in-AI-AssistView.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FImage-Preview-in-AI-AssistView.gif" alt="Image Preview support in AI AssistView" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Image Preview support in AI AssistView
  &lt;p&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Time-based Message Grouping&lt;/strong&gt; automatically organizes conversations into sections such as Today, Yesterday, and earlier dates, making long chat histories easier to navigate.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FTime-based-Message-Grouping-in-AI-AssistView.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FTime-based-Message-Grouping-in-AI-AssistView.png" alt="Time-based Message Grouping support in AI AssistView" width="780" height="434"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Time-based Message Grouping support in AI AssistView
  &lt;p&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Resizable Prompt Input&lt;/strong&gt; provides additional editing space for longer prompts, detailed instructions, and code snippets.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FResizable-Prompt-Input-in-AI-AssistView.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FResizable-Prompt-Input-in-AI-AssistView.png" alt="Resizable Prompt Input support in AI AssistView" width="780" height="425"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Resizable Prompt Input support in AI AssistView
  &lt;p&gt;&lt;/p&gt;

&lt;p&gt;Together, these enhancements create a more natural and productive chat experience without requiring additional customization.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cartesian Charts
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://www.syncfusion.com/maui-controls/maui-cartesian-charts/chart-types" rel="noopener noreferrer"&gt;Cartesian Charts&lt;/a&gt; control gains new visualization capabilities that help developers present complex information more effectively.&lt;/p&gt;

&lt;h3&gt;
  
  
  Point color mapping
&lt;/h3&gt;

&lt;p&gt;Data often needs visual differentiation to highlight categories, trends, or exceptions. Point Color Mapping allows colors to be assigned directly from the data source using brushes, color values, or hexadecimal color codes.&lt;/p&gt;

&lt;p&gt;This makes it simple to create more expressive charts while keeping configuration straightforward.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FPoint-Color-Mapping-in-Cartesian-Charts.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FPoint-Color-Mapping-in-Cartesian-Charts.png" alt="Point Color Mapping support in Cartesian Charts" width="781" height="380"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Point Color Mapping support in Cartesian Charts
  &lt;p&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Multilevel labels
&lt;/h3&gt;

&lt;p&gt;Large datasets frequently contain multiple layers of categorization. Multilevel Labels help organize axis labels into hierarchical groups, making complex information easier to interpret.&lt;/p&gt;

&lt;p&gt;This enhancement is especially useful for dashboards, scheduling applications, financial reports, and business analytics solutions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FMultilevel-Labels-in-Cartesian-Charts.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FMultilevel-Labels-in-Cartesian-Charts.png" alt="Multilevel Labels support in Cartesian Charts" width="780" height="468"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Multilevel Labels support in Cartesian Charts
  &lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  DataGrid
&lt;/h2&gt;

&lt;p&gt;This release introduces several &lt;a href="https://www.syncfusion.com/maui-controls/maui-datagrid" rel="noopener noreferrer"&gt;DataGrid&lt;/a&gt; enhancements focused on improving productivity and reducing the effort required to work with large datasets.&lt;/p&gt;

&lt;h3&gt;
  
  
  Undo and redo support
&lt;/h3&gt;

&lt;p&gt;Data entry mistakes are inevitable, especially when working with large collections of records. Undo and Redo support allows users to quickly reverse or reapply changes, providing greater confidence during editing operations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FUndo-and-redo-support-in-DataGrid.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FUndo-and-redo-support-in-DataGrid.gif" alt="Undo and redo support in DataGrid" width="800" height="626"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Undo and redo support in DataGrid
  &lt;p&gt;&lt;/p&gt;

&lt;p&gt;Read the full blog post on the &lt;a href="https://www.syncfusion.com/blogs/post/maui-2026-volume-2-updates" rel="noopener noreferrer"&gt;Syncfusion Website&lt;/a&gt;&lt;/p&gt;

</description>
      <category>netmaui</category>
      <category>crossplatformdevelop</category>
      <category>releasehighlights</category>
      <category>releaseupdates</category>
    </item>
    <item>
      <title>Still Building Custom Chart Builders? Build Runtime Charts with Blazor Chart Wizard</title>
      <dc:creator>Lucy Muturi</dc:creator>
      <pubDate>Fri, 10 Jul 2026 14:09:12 +0000</pubDate>
      <link>https://dev.to/syncfusion/build-runtime-configurable-charts-in-blazor-using-chart-wizard-3e2a</link>
      <guid>https://dev.to/syncfusion/build-runtime-configurable-charts-in-blazor-using-chart-wizard-3e2a</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Building configurable dashboards usually means creating custom chart builders, field selectors, and persistence logic. Learn how the new Blazor Chart Wizard eliminates that work by letting users configure, save, and export charts directly at runtime.&lt;/p&gt;

&lt;p&gt;A dashboard that starts with a simple column chart rarely stays that way.&lt;/p&gt;

&lt;p&gt;Business users eventually ask to switch chart types, compare different metrics, save personalized layouts, and export visualizations without waiting for another development cycle.&lt;/p&gt;

&lt;p&gt;Supporting these requests often requires developers to build configuration panels, field selectors, chart customization interfaces, persistence mechanisms, and export workflows. In many projects, maintaining the chart configuration experience becomes almost as much work as building the dashboard itself.&lt;/p&gt;

&lt;p&gt;The Syncfusion&lt;sup&gt;®&lt;/sup&gt; &lt;a href="https://www.syncfusion.com/blazor-components/blazor-chart-wizard" rel="noopener noreferrer"&gt;Blazor Chart Wizard&lt;/a&gt;, a new component introduced in Essential Studio&lt;sup&gt;® &lt;/sup&gt; &lt;a href="https://help.syncfusion.com/common/essential-studio/release-notes/v34.1.29" rel="noopener noreferrer"&gt;2026 Volume 2&lt;/a&gt; release, takes a different approach.&lt;/p&gt;

&lt;p&gt;Instead of developers defining every chart configuration at design time, Chart Wizard provides a guided runtime experience that allows users to create, customize, save, restore, print, and export charts directly within a Blazor application.&lt;/p&gt;

&lt;p&gt;In this article, you’ll build an Olympic medal dashboard using the Chart Wizard component. Along the way, you’ll learn how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bind business data to Chart Wizard&lt;/li&gt;
&lt;li&gt;Enable runtime chart customization&lt;/li&gt;
&lt;li&gt;Allow users to save and restore chart layouts&lt;/li&gt;
&lt;li&gt;Configure export functionality&lt;/li&gt;
&lt;li&gt;Understand when Chart Wizard is a better choice than a traditional chart component&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the end, you’ll have a practical understanding of how Chart Wizard can reduce development effort while delivering more flexibility to end users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not just use Syncfusion Chart?
&lt;/h2&gt;

&lt;p&gt;Many Blazor applications already use the &lt;a href="https://www.syncfusion.com/blazor-components/blazor-charts" rel="noopener noreferrer"&gt;SfChart&lt;/a&gt; component to render charts. So why introduce another charting component? The answer comes down to who controls the visualization.&lt;/p&gt;

&lt;p&gt;With the standard chart component, developers define:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chart type&lt;/li&gt;
&lt;li&gt;Series configuration&lt;/li&gt;
&lt;li&gt;Axis settings&lt;/li&gt;
&lt;li&gt;Data mappings&lt;/li&gt;
&lt;li&gt;Styling options&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Users interact with the finished chart, but typically cannot modify its structure without changes to the application.&lt;/p&gt;

&lt;h2&gt;
  
  
  When should you use Chart Wizard?
&lt;/h2&gt;

&lt;p&gt;A standard chart component works well when developers control every aspect of the visualization.&lt;/p&gt;

&lt;p&gt;Our Blazor Chart Wizard shines when users need flexibility after deployment.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&amp;nbsp;Scenario&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&amp;nbsp;Standard Chart&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&amp;nbsp;Chart Wizard&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;Fixed chart configuration&lt;/td&gt;
&lt;td&gt;&amp;nbsp;Yes&lt;/td&gt;
&lt;td&gt;&amp;nbsp;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;Users switch chart types&lt;/td&gt;
&lt;td&gt;&amp;nbsp;No&lt;/td&gt;
&lt;td&gt;&amp;nbsp;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;Runtime field mapping&lt;/td&gt;
&lt;td&gt;&amp;nbsp;No&lt;/td&gt;
&lt;td&gt;&amp;nbsp;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;Dashboard personalization&lt;/td&gt;
&lt;td&gt;&amp;nbsp;No&lt;/td&gt;
&lt;td&gt;&amp;nbsp;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;Save and restore chart layouts&lt;/td&gt;
&lt;td&gt;&amp;nbsp;No&lt;/td&gt;
&lt;td&gt;&amp;nbsp;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;Lightweight visualization only&lt;/td&gt;
&lt;td&gt;&amp;nbsp;Yes&lt;/td&gt;
&lt;td&gt;&amp;nbsp;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Think of Chart Wizard as a chart-authoring experience rather than a chart control.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you will build
&lt;/h2&gt;

&lt;p&gt;The completed sample includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An &lt;strong&gt;&lt;code&gt;SfChartWizard&lt;/code&gt;&lt;/strong&gt; component.&lt;/li&gt;
&lt;li&gt;Medal data from the &lt;a href="https://www.olympics.com/en/olympic-games/paris-2024/medals" rel="noopener noreferrer"&gt;Paris 2024&lt;/a&gt; Olympic Games.&lt;/li&gt;
&lt;li&gt;Runtime chart configuration.&lt;/li&gt;
&lt;li&gt;Chart layout persistence using serialization.&lt;/li&gt;
&lt;li&gt;Built-in export capabilities.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is a dashboard where users can experiment with visualizations without requiring application updates.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FInteractive-Chart-Wizard-Visualization-of-Paris-2024-Olympic-Medal-Standings.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FInteractive-Chart-Wizard-Visualization-of-Paris-2024-Olympic-Medal-Standings.png" alt="Interactive Chart Wizard Visualization of Paris 2024 Olympic Medal Standings" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Interactive Chart Wizard Visualization of Paris 2024 Olympic Medal Standings
  &lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How Chart Wizard fits into a dashboard
&lt;/h2&gt;

&lt;p&gt;In a typical analytics solution, your application remains responsible for retrieving, securing, and validating data.&lt;/p&gt;

&lt;p&gt;Chart Wizard sits on top of that data and provides a user-friendly configuration layer.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                   **Database / API**  
                           ↓  
                 **Application Services**  
                           ↓  
                    **SfChartWizard**  
                           ↓  
                      **End User**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This separation keeps business logic inside your application while giving users freedom to explore data visually.&lt;/p&gt;

&lt;p&gt;New to Chart Wizard? The official &lt;a href="https://blazor.syncfusion.com/documentation/chart-wizard/getting-started" rel="noopener noreferrer"&gt;Getting Started&lt;/a&gt; guide walks you through the complete setup process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building an Olympic medal dashboard with Chart Wizard
&lt;/h2&gt;

&lt;p&gt;Let’s build an interactive Olympic medal dashboard that supports chart customization, layout persistence, and export.&lt;/p&gt;

&lt;h3&gt;
  
  
  Define the data model
&lt;/h3&gt;

&lt;p&gt;Chart Wizard works with standard .NET objects, making it easy to integrate with existing business data. We’ll use a simple model representing Olympic medal standings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OlympicMedalData&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Country&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Empty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;GoldMedals&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; 
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;SilverMedals&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; 
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;BronzeMedals&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Prepare sample Olympic medal data
&lt;/h3&gt;

&lt;p&gt;In this example, we’ll use medal data from the &lt;a href="https://www.olympics.com/en/olympic-games/paris-2024/medals" rel="noopener noreferrer"&gt;Paris 2024&lt;/a&gt; Olympics.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;OlympicMedalData&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;MedalRecords&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Country&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"United States"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;GoldMedals&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;SilverMedals&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;44&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;BronzeMedals&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;42&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="err"&gt;…&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Country&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"France"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;GoldMedals&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;SilverMedals&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;26&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;BronzeMedals&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;22&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configure category and series fields
&lt;/h3&gt;

&lt;p&gt;Next, choose the category and series fields. The Chart Wizard uses category fields for labels and numeric fields for series, helping it determine the best way to visualize your data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;CategoryFields&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s"&gt;"Country"&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SeriesFields&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s"&gt;"GoldMedals"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"SilverMedals"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"BronzeMedals"&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Add the Chart Wizard component
&lt;/h3&gt;

&lt;p&gt;We’ll add the &lt;strong&gt;&lt;code&gt;SfChartWizard&lt;/code&gt;&lt;/strong&gt; component to your Blazor page and bind it to the Olympic medal data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;razor&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;@using&lt;/span&gt; &lt;span class="n"&gt;Syncfusion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Blazor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ChartWizard&lt;/span&gt; 

&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;SfChartWizard&lt;/span&gt; &lt;span class="n"&gt;Width&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"100%"&lt;/span&gt; &lt;span class="n"&gt;Height&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"600px"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; 
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ChartSettings&lt;/span&gt; &lt;span class="n"&gt;DataSource&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"@MedalRecords"&lt;/span&gt; 
                   &lt;span class="n"&gt;CategoryFields&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"@CategoryFields"&lt;/span&gt; 
                   &lt;span class="n"&gt;SeriesFields&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"@SeriesFields"&lt;/span&gt; 
                   &lt;span class="n"&gt;SeriesType&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"ChartWizardSeriesType.Column"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; 
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;ChartSettings&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; 
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;SfChartWizard&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What happens next?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After deployment, users can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Switch chart types.&lt;/li&gt;
&lt;li&gt;Modify series mappings.&lt;/li&gt;
&lt;li&gt;Reconfigure the visualization.&lt;/li&gt;
&lt;li&gt;Explore the data from different perspectives.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without Chart Wizard, supporting these capabilities typically requires building custom interfaces.&lt;/p&gt;

&lt;p&gt;You can use the &lt;strong&gt;&lt;code&gt;SeriesType&lt;/code&gt;&lt;/strong&gt; property to set the initial chart type, while the wizard allows configuration changes to supported chart types at runtime.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FInteractive-Chart-Wizard-Visualization-of-Paris-2024-Olympic-Medal-Standings.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FInteractive-Chart-Wizard-Visualization-of-Paris-2024-Olympic-Medal-Standings.png" alt="Interactive Chart Wizard Visualization of Paris 2024 Olympic Medal Standings" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Interactive Chart Wizard Visualization of Paris 2024 Olympic Medal Standings
  &lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Enhance the Chart Wizard with advanced features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Save and restore chart configuration
&lt;/h3&gt;

&lt;p&gt;Users often spend time configuring charts exactly the way they want. Serialization allows those configurations to be saved and restored later.&lt;/p&gt;

&lt;p&gt;Two methods make this possible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;SaveChart()&lt;/code&gt;&lt;/strong&gt;: Serializes the current chart state and returns it as a JSON string.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;LoadChartAsync(string data)&lt;/code&gt;&lt;/strong&gt;: Loads a chart configuration from a JSON string produced by &lt;strong&gt;&lt;code&gt;SaveChart()&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use the following example to wire save and restore buttons.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;razor&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="err"&gt;="&lt;/span&gt;&lt;span class="nc"&gt;toolbar&lt;/span&gt;&lt;span class="s"&gt;" style="&lt;/span&gt;&lt;span class="n"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="n"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="s"&gt;"&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="err"&gt;="&lt;/span&gt;&lt;span class="nc"&gt;btn&lt;/span&gt; &lt;span class="n"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;primary&lt;/span&gt;&lt;span class="s"&gt;" @onclick="&lt;/span&gt;&lt;span class="n"&gt;SaveChartAsync&lt;/span&gt;&lt;span class="s"&gt;"&amp;gt;Save layout&amp;lt;/button&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="err"&gt;="&lt;/span&gt;&lt;span class="nc"&gt;btn&lt;/span&gt; &lt;span class="n"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;secondary&lt;/span&gt;&lt;span class="s"&gt;"
&lt;/span&gt;            &lt;span class="n"&gt;@onclick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"LoadChartAsync"&lt;/span&gt;
            &lt;span class="n"&gt;disabled&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"@string.IsNullOrWhiteSpace(serializedChart)"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="n"&gt;Restore&lt;/span&gt; &lt;span class="n"&gt;layout&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;@code&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;//……&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;SaveChartAsync&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; 
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ChartWizard&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;statusMessage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Chart Wizard is not ready yet."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CompletedTask&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;serializedChart&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ChartWizard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SaveChart&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;statusMessage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Chart layout saved for this session."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CompletedTask&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;LoadChartAsync&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ChartWizard&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsNullOrWhiteSpace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;serializedChart&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;statusMessage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"No saved chart layout is available."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;ChartWizard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LoadChartAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;serializedChart&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;statusMessage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Saved chart layout restored."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;//…&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The serialized output can be stored in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Databases&lt;/li&gt;
&lt;li&gt;Browser storage&lt;/li&gt;
&lt;li&gt;Files&lt;/li&gt;
&lt;li&gt;Cloud storage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes it possible to provide personalized dashboards that survive between sessions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FChart-Wizard-with-Serialization.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FChart-Wizard-with-Serialization.png" alt="Chart Wizard with Serialization" width="800" height="476"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Chart Wizard with Serialization
  &lt;p&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Persist saved chart layouts
&lt;/h3&gt;

&lt;p&gt;When storing chart configurations, remember that applications evolve.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Field names may change.&lt;/li&gt;
&lt;li&gt;Data models may be reorganized.&lt;/li&gt;
&lt;li&gt;Users may load configurations created months earlier.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For that reason, consider storing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SavedChartLayout&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;UserId&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Empty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;LayoutName&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Empty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;ChartStateJson&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Empty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;DataSchemaVersion&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"v1"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt; &lt;span class="n"&gt;UpdatedUtc&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Save operation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SavedChartLayout&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;UserId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;LayoutName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"My Medal Dashboard"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ChartStateJson&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ChartWizard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SaveChart&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="n"&gt;UpdatedUtc&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UtcNow&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="n"&gt;dbContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ChartLayouts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;dbContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SaveChangesAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Load operation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;dbContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ChartLayouts&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FirstOrDefaultAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;layoutId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;ChartWizard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LoadChartAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ChartStateJson&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Store a schema version with the layout. If you later rename &lt;strong&gt;&lt;code&gt;GoldMedals&lt;/code&gt;&lt;/strong&gt; to Gold, an old, saved layout may reference a field that no longer exists.&lt;/p&gt;

&lt;h4&gt;
  
  
  Handling invalid saved layouts
&lt;/h4&gt;

&lt;p&gt;Saved layouts can become invalid if fields are renamed, removed, or reorganized after deployment.&lt;/p&gt;

&lt;p&gt;Before calling &lt;strong&gt;&lt;code&gt;LoadChartAsync()&lt;/code&gt;&lt;/strong&gt;, consider validating:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Layout ownership&lt;/li&gt;
&lt;li&gt;Schema version compatibility&lt;/li&gt;
&lt;li&gt;Required fields&lt;/li&gt;
&lt;li&gt;JSON format integrity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If validation fails, notify the user and fall back to a default chart configuration rather than attempting to restore the layout.&lt;/p&gt;

&lt;p&gt;Read the full blog post on the &lt;a href="https://www.syncfusion.com/blogs/post/blazor-chart-wizard" rel="noopener noreferrer"&gt;Syncfusion Website&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blazor</category>
      <category>blazorchartwizard</category>
      <category>bashboarddevelopment</category>
      <category>datavisualization</category>
    </item>
    <item>
      <title>Need Faster Document Processing? See What's New in Document SDK 2026 Volume 2</title>
      <dc:creator>Lucy Muturi</dc:creator>
      <pubDate>Wed, 08 Jul 2026 14:48:47 +0000</pubDate>
      <link>https://dev.to/syncfusion/need-faster-document-processing-see-whats-new-in-document-sdk-2026-volume-2-583k</link>
      <guid>https://dev.to/syncfusion/need-faster-document-processing-see-whats-new-in-document-sdk-2026-volume-2-583k</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Struggling with complex document automation or AI integration? Syncfusion Document SDK 2026 Volume 2 introduces AI Agent Tools, Markdown conversion, enhanced OCR, and performance improvements across PDF, Word, Excel, and PowerPoint libraries to help you build faster, smarter, and more reliable document solutions.&lt;/p&gt;

&lt;p&gt;If you’ve ever spent hours maintaining PDF parsers, fixing document conversion issues, or trying to make AI understand complex document content, you’re not alone. Document-heavy applications often become difficult to maintain as requirements grow across formats, platforms, and automation scenarios.&lt;/p&gt;

&lt;p&gt;Syncfusion &lt;a href="https://help.syncfusion.com/common/essential-studio/release-notes/v34.1.29" rel="noopener noreferrer"&gt;Essential Studio&lt;sup&gt;®&lt;/sup&gt; 2026 Volume 2&lt;/a&gt; for &lt;a href="https://help.syncfusion.com/document-processing/release-notes/v34.1.29" rel="noopener noreferrer"&gt;Document Processing&lt;/a&gt; addresses these challenges with AI agent tools, Markdown conversion, and enhancements across PDF, Word, Excel, and PowerPoint libraries.&lt;/p&gt;

&lt;p&gt;Here’s what’s new and why it matters in real-world applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deterministic Document Processing for AI Agents
&lt;/h2&gt;

&lt;p&gt;AI-powered document processes often break down at the same point: document structure. Large language models don’t natively understand PDFs, Word files, or spreadsheets. Teams end up stitching together prompts, parsers, converters, and validators, creating pipelines that are hard to maintain and easy to break.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI Agent Tools for the Document SDK
&lt;/h3&gt;

&lt;p&gt;The Syncfusion &lt;a href="https://www.syncfusion.com/explore/ai-agent-tools-for-document-sdk/" rel="noopener noreferrer"&gt;AI Agent Tools&lt;/a&gt; library addresses this by providing AI agents with direct access to reliable, production-ready document operations via callable tools powered by the Syncfusion Document SDK.&lt;/p&gt;

&lt;p&gt;Instead of asking an LLM to “figure out” document structure, agents can now invoke deterministic operations such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PDF:&lt;/strong&gt; Create, convert, redact, sign, merge, and compress PDFs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Word:&lt;/strong&gt; Perform mail merge, track changes, and convert documents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Excel:&lt;/strong&gt; Create charts, work with formulas and pivot tables, and export data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PowerPoint:&lt;/strong&gt; Merge, split, and convert presentations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Office-to-PDF:&lt;/strong&gt; Convert Word, Excel, and PowerPoint files to PDF.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart Data Extraction:&lt;/strong&gt; Extract tables, forms, text, and scanned-image content as structured JSON.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The library runs entirely within your infrastructure on-premises or private cloud and integrates with OpenAI, Azure OpenAI, Claude, or custom orchestration systems. Documents never leave your environment.&lt;/p&gt;

&lt;p&gt;Execution can be handled entirely in memory for low-latency operations or through cloud-backed storage (Azure Blob Storage or Amazon S3) for scalable, stateless processing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-world example:&lt;/strong&gt; An insurance claims application can use AI Agent Tools to extract data from uploaded documents, generate reports, convert files, and archive records without relying on custom parsing logic for each document type.&lt;/p&gt;

&lt;p&gt;Download the &lt;a href="https://www.nuget.org/packages/Syncfusion.DocumentSDK.AI.AgentTools" rel="noopener noreferrer"&gt;AI Agent Tools NuGet&lt;/a&gt; package and extend it with your own custom AI agent tools by cloning the &lt;a href="https://github.com/syncfusion/document-sdk-ai-agent-tools/tree/master/Syncfusion.DocumentSDK.AI.AgentTools" rel="noopener noreferrer"&gt;open-source repository&lt;/a&gt; for the &lt;a href="https://help.syncfusion.com/document-processing/ai-agent-tools/example-use-cases" rel="noopener noreferrer"&gt;real-world use cases&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FDocument-SDK-AI-Tools.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FDocument-SDK-AI-Tools.png" alt="Document SDK AI Tools" width="669" height="406"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Document SDK AI Tools
  &lt;p&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Agent Skills: Accurate SDK code inside your IDE
&lt;/h3&gt;

&lt;p&gt;Alongside AI Agent Tools, Document SDK &lt;a href="https://help.syncfusion.com/document-processing/skills/document-sdk" rel="noopener noreferrer"&gt;Agent Skills&lt;/a&gt; focus on developer productivity.&lt;/p&gt;

&lt;p&gt;Agent Skills ground AI coding assistants in verified Syncfusion APIs, eliminating outdated or hallucinated code suggestions. When installed, supported IDEs and assistants can generate accurate, production-ready code using the correct NuGet packages and platform-specific patterns.&lt;/p&gt;

&lt;p&gt;Agent Skills support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Word, PDF, Excel, PowerPoint, Markdown, data extraction, and calculation libraries&lt;/li&gt;
&lt;li&gt;.NET, Java, Flutter, and JavaScript platforms&lt;/li&gt;
&lt;li&gt;Works with GitHub Copilot, Visual Studio Code, Code Studio, Cursor, Claude, and more.&lt;/li&gt;
&lt;li&gt;Two operating modes: Generate code (Mode 1), Execute via csx script (Mode 2)&lt;/li&gt;
&lt;li&gt;One-command installation and granular skill selection&lt;/li&gt;
&lt;li&gt;Auto loaded by supported agents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Depending on the prompt style, developers can either generate ready-to-use code snippets or execute document actions directly via temporary scripts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-world example:&lt;/strong&gt; A development team building a document management system can generate SDK-specific code directly inside their IDE, reducing time spent searching documentation and correcting AI-generated code suggestions.&lt;/p&gt;

&lt;p&gt;Stop building fragile LLM-to-document pipelines from scratch! Explore Syncfusion AI Agent Tools &lt;a href="https://help.syncfusion.com/document-processing/ai-agent-tools/getting-started" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; and Document SDK Agent Skills &lt;a href="https://help.syncfusion.com/document-processing/skills/document-sdk" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; to get started.&lt;/p&gt;

&lt;h2&gt;
  
  
  Markdown as a first-class enterprise format
&lt;/h2&gt;

&lt;p&gt;Markdown has become the preferred authoring format for developers and content teams, but most enterprise delivery still happens in Word, Excel, PowerPoint, and PDF. Bridging that gap manually slows everything down.&lt;/p&gt;

&lt;h3&gt;
  
  
  .NET Markdown Library (Preview)
&lt;/h3&gt;

&lt;p&gt;The Syncfusion &lt;a href="https://www.syncfusion.com/document-sdk/net-markdown-library" rel="noopener noreferrer"&gt;.NET Markdown Library&lt;/a&gt; introduces a structured document object model for Markdown, allowing developers to create, read, and edit Markdown programmatically without external dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you can build and format&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Document creation with DOM:&lt;/strong&gt; &lt;a href="https://document.syncfusion.com/demos/markdown/wordtomarkdownconverter#/tailwind" rel="noopener noreferrer"&gt;Create Markdown&lt;/a&gt; documents programmatically using a structured, intuitive object model for clean, maintainable code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rich content support:&lt;/strong&gt;  Add and organize Headings, paragraphs, block quotes, thematic breaks, tables, lists, and checkboxes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced text formatting:&lt;/strong&gt;  Apply rich formatting including bold, italic, strikethrough, inline code, subscript, and superscript.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Media and linking:&lt;/strong&gt;  Insert images and hyperlinks to enhance document interactivity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code block support:&lt;/strong&gt;  Easily include formatted code blocks for technical documentation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Supported conversion:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Seamlessly convert Markdown to and from multiple popular file formats using Syncfusion libraries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Word documents:&lt;/strong&gt;  Convert &lt;a href="https://help.syncfusion.com/document-processing/word/conversions/markdown-to-word-conversion" rel="noopener noreferrer"&gt;Markdown to Word&lt;/a&gt; and text formats such as .doc, .docx, .xml, &lt;a href="https://www.syncfusion.com/blogs/post/markdown-to-html-csharp-word-library" rel="noopener noreferrer"&gt;.html&lt;/a&gt;, and .rtf, and convert &lt;a href="https://help.syncfusion.com/document-processing/word/conversions/word-to-markdown-conversion" rel="noopener noreferrer"&gt;Word documents to Markdown&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Excel documents:&lt;/strong&gt; Convert &lt;a href="https://help.syncfusion.com/document-processing/excel/conversions/excel-to-markdown/overview" rel="noopener noreferrer"&gt;Excel&lt;/a&gt; files to and from &lt;a href="https://help.syncfusion.com/document-processing/excel/conversions/markdown-to-excel/overview" rel="noopener noreferrer"&gt;Markdown&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PowerPoint presentations:&lt;/strong&gt;  Convert &lt;a href="https://help.syncfusion.com/document-processing/powerpoint/conversions/powerpoint-to-markdown" rel="noopener noreferrer"&gt;PPTX files to Markdown&lt;/a&gt; and generate &lt;a href="https://help.syncfusion.com/document-processing/powerpoint/conversions/markdown-to-powerpoint" rel="noopener noreferrer"&gt;PPTX files from Markdown&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PDF documents:&lt;/strong&gt;  Convert &lt;a href="https://www.syncfusion.com/blogs/post/markdown-to-pdf-in-csharp-word-library" rel="noopener noreferrer"&gt;Markdown to PDF&lt;/a&gt; format and convert &lt;a href="https://help.syncfusion.com/document-processing/data-extraction/net/conversions/pdf-to-markdown" rel="noopener noreferrer"&gt;PDF documents to Markdown&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FMarkdown-File-Format-Conversions.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FMarkdown-File-Format-Conversions.png" alt="Markdown File Format Conversions in .NET Markdown Library" width="800" height="314"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Markdown File Format Conversions in .NET Markdown Library
  &lt;p&gt;&lt;/p&gt;

&lt;p&gt;The Syncfusion .NET Markdown Library covers more conversion targets than any comparable lightweight Markdown library, making it the practical choice for teams that need Markdown as a bridge between authoring and enterprise delivery formats.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-world example:&lt;/strong&gt; A documentation platform can store content in Markdown and automatically publish it as Word, PDF, PowerPoint, and Excel files for different audiences without maintaining separate versions of the same content.&lt;/p&gt;

&lt;h2&gt;
  
  
  PDF enhancements across platforms
&lt;/h2&gt;

&lt;h3&gt;
  
  
  .NET PDF Library: HTML-to-PDF security update
&lt;/h3&gt;

&lt;p&gt;HTML-to-PDF remains a core process for invoices, dashboards, and reports. In this release, the Blink binaries used for HTML-to-PDF conversion have been updated to version 147.0.7727.56, which addresses known security vulnerabilities and improves conversion reliability.&lt;/p&gt;

&lt;h3&gt;
  
  
  JavaScript PDF Library: Layout and metadata control
&lt;/h3&gt;

&lt;p&gt;The JavaScript PDF Library now offers deeper layout-level control, enabling more complex client-side PDF generation.&lt;/p&gt;

&lt;p&gt;New capabilities include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Layout-aware text elements&lt;/strong&gt; with styling, alignment, and automatic pagination.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FLayout%25E2%2580%2591Aware-Text-Elements-in-JavaScript-PDF-Library.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FLayout%25E2%2580%2591Aware-Text-Elements-in-JavaScript-PDF-Library.png" alt="Layout‑Aware Text Elements in JavaScript PDF Library" width="780" height="465"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Layout‑Aware Text Elements in JavaScript PDF Library
  &lt;p&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reusable header and footer templates&lt;/strong&gt; with static content and dynamic fields such as page numbers and dates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FReusable-Headers-Footers-in-JavaScript-PDF-Library.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FReusable-Headers-Footers-in-JavaScript-PDF-Library.png" alt="Reusable Headers &amp;amp; Footers in JavaScript PDF Library" width="781" height="446"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Reusable Headers &amp;amp; Footers in JavaScript PDF Library
  &lt;p&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;XMP metadata embedding&lt;/strong&gt; for standardized document indexing, searchability, and archival procedures.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For more details, check our JavaScript PDF library &lt;a href="https://help.syncfusion.com/document-processing/pdf/pdf-library/javascript/overview" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-world example:&lt;/strong&gt; A reporting application can generate secure, metadata-rich PDF invoices and statements directly from HTML while improving document traceability and searchability.&lt;/p&gt;

&lt;h3&gt;
  
  
  Smarter Data Extraction and OCR control
&lt;/h3&gt;

&lt;h4&gt;
  
  
  .NET Data Extraction Library updates
&lt;/h4&gt;

&lt;p&gt;Accuracy in document extraction often depends on how much control you have over OCR and image handling. This release adds two practical improvements to the Syncfusion &lt;a href="https://www.syncfusion.com/document-sdk/net-pdf-data-extraction" rel="noopener noreferrer"&gt;.NET Data Extraction Library&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Custom image handling&lt;/strong&gt;: Access extracted images as streams and choose whether to embed them directly in Markdown as base64 or reference them via URLs in cloud storage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configurable OCR settings&lt;/strong&gt;: Fine-tune language selection, OCR engine version, image preprocessing, page segmentation, and multi-language handling before extraction begins.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These controls are especially valuable in healthcare, logistics, and financial processes where extraction accuracy directly affects downstream systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-world example:&lt;/strong&gt; A healthcare provider can extract information from scanned patient records using customized OCR settings, improving recognition accuracy before the data is routed to downstream systems.&lt;/p&gt;

&lt;p&gt;If your extraction pipeline is losing accuracy because OCR settings are locked down, this release gives you the control you’ve been missing. Explore the .NET Data Extraction Library &lt;a href="https://help.syncfusion.com/document-processing/data-extraction/overview" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Excel, Word, and PowerPoint improvements
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.syncfusion.com/document-sdk/net-excel-library" rel="noopener noreferrer"&gt;.NET Excel Library&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://help.syncfusion.com/document-processing/excel/excel-library/net/working-with-pictures#adding-place-in-cell-images" rel="noopener noreferrer"&gt;Place images&lt;/a&gt; directly inside cells so they move and resize naturally with cell changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FImages-Inside-Cells-in-.NET-Excel-Library.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FImages-Inside-Cells-in-.NET-Excel-Library.png" alt="Images Inside Cells in .NET Excel Library" width="780" height="577"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Images Inside Cells in .NET Excel Library
  &lt;p&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://help.syncfusion.com/document-processing/excel/conversions/excel-to-markdown/net/excel-to-markdown-conversion" rel="noopener noreferrer"&gt;Convert Excel files&lt;/a&gt; to clean Markdown for documentation or publishing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FConvert-Excel-to-Markdown-in-.NET-Excel-Library.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FConvert-Excel-to-Markdown-in-.NET-Excel-Library.jpg" alt="Convert Excel to Markdown in .NET Excel Library" width="800" height="556"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Convert Excel to Markdown in .NET Excel Library
  &lt;p&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://help.syncfusion.com/document-processing/excel/conversions/markdown-to-excel/net/markdown-to-excel-conversion" rel="noopener noreferrer"&gt;Convert Markdown&lt;/a&gt; back into structured Excel data for reporting and analysis.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FConvert-Markdown-to-Excel-in-.NET-Excel-Library.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FConvert-Markdown-to-Excel-in-.NET-Excel-Library.jpg" alt="Convert Markdown to Excel in .NET Excel Library" width="800" height="556"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Convert Markdown to Excel in .NET Excel Library
  &lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-world example:&lt;/strong&gt; A financial reporting application can convert spreadsheet data into Markdown for review, then regenerate structured Excel reports from updated content when publishing final results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.syncfusion.com/document-sdk/net-word-library" rel="noopener noreferrer"&gt;.NET Word Library&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Up to &lt;a href="https://help.syncfusion.com/document-processing/word/word-library/net/performance-metrics" rel="noopener noreferrer"&gt;70% faster clone&lt;/a&gt; and merge operations, ideal for high-volume document generation&lt;/li&gt;
&lt;li&gt;Improved HTML parsing with better support for attributes across paragraph and heading tags&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This update delivers immediate, measurable gains for high-volume Word processing workloads. See the Syncfusion .NET Word Library &lt;a href="https://help.syncfusion.com/document-processing/word/word-library/net/overview" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-world example:&lt;/strong&gt; Organizations that generate thousands of personalized contracts or customer letters each day can reduce processing time by accelerating document cloning and merging.&lt;/p&gt;

&lt;p&gt;Read the full blog post on the &lt;a href="https://www.syncfusion.com/blogs/post/document-editor-sdks-2026-volume-2" rel="noopener noreferrer"&gt;Syncfusion Website&lt;/a&gt;&lt;/p&gt;

</description>
      <category>syncfusion</category>
      <category>netdevelopment</category>
      <category>aidocumentworkflows</category>
      <category>developertools</category>
    </item>
    <item>
      <title>From Faster PDFs to AI-Powered Spreadsheets: See What’s New in Syncfusion 2026 Volume 2</title>
      <dc:creator>Lucy Muturi</dc:creator>
      <pubDate>Tue, 07 Jul 2026 11:34:15 +0000</pubDate>
      <link>https://dev.to/syncfusion/whats-new-in-syncfusion-document-processing-sdks-2026-volume-2-ai-powered-spreadsheets-faster-4231</link>
      <guid>https://dev.to/syncfusion/whats-new-in-syncfusion-document-processing-sdks-2026-volume-2-ai-powered-spreadsheets-faster-4231</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Syncfusion 2026 Volume 2 delivers performance and usability upgrades across document processing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PDF Viewer SDK: Up to 92% faster annotation processing, partial ink erasing, comment filtering, and improved bookmark rendering.&lt;/li&gt;
&lt;li&gt;DOCX Editor SDK: Accurate bidirectional (RTL/LTR) text formatting and modern hashing for reliable document protection.&lt;/li&gt;
&lt;li&gt;Spreadsheet Editor SDK: AI-powered natural language operations, quicker bulk updates with suspend/resume APIs, subscript/superscript support, ribbon customization, conditional formatting, export options, and quick auto-aggregation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Built to fix real production bottlenecks so that large documents, multilingual content, and data-heavy spreadsheets behave reliably at scale.&lt;/p&gt;

&lt;p&gt;Ever watched a PDF with 500+ annotations slow to a crawl? Opened a multilingual Word document only to find the text direction completely off? Or worked with a spreadsheet that seemed fine until a bulk update turned the UI unresponsive?&lt;/p&gt;

&lt;p&gt;These aren’t the kind of problems you see in demos; they only show up in production.&lt;/p&gt;

&lt;p&gt;Document-heavy apps tend to accumulate a specific kind of technical debt:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Performance drops&lt;/strong&gt; only when file size and complexity grow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Formatting breaks&lt;/strong&gt; in multilingual or edge-case content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing controls&lt;/strong&gt; force you to build custom workarounds just to ship.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Syncfusion&lt;sup&gt;®&lt;/sup&gt; &lt;a href="https://www.syncfusion.com/forums/198475/essential-studio-2026-volume-2-main-release-v34-1-29-is-available-for-download" rel="noopener noreferrer"&gt;2026 Volume 2&lt;/a&gt; release is built around fixing those exact issues without adding noise. It delivers practical, high-impact improvements across three core SDKs: &lt;a href="https://www.syncfusion.com/pdf-viewer-sdk" rel="noopener noreferrer"&gt;PDF Viewer&lt;/a&gt;, &lt;a href="https://www.syncfusion.com/docx-editor-sdk" rel="noopener noreferrer"&gt;DOCX Editor&lt;/a&gt;, and &lt;a href="https://www.syncfusion.com/spreadsheet-editor-sdk" rel="noopener noreferrer"&gt;Spreadsheet Editor&lt;/a&gt; &lt;strong&gt;,&lt;/strong&gt; targeting real bottlenecks in Web, Blazor, and .NET MAUI platforms.&lt;/p&gt;

&lt;p&gt;Whether you’re building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;document review tool&lt;/strong&gt; handling annotation-heavy PDFs,&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;content editor&lt;/strong&gt; with mixed-language support, or&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;data-heavy spreadsheet interface,&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;these changes are designed to remove the friction you’ve likely already run into.&lt;/p&gt;

&lt;p&gt;Let’s break down what’s changed, and more importantly, see where it makes your development experience smoother.&lt;/p&gt;

&lt;h2&gt;
  
  
  PDF Viewer SDK
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://help.syncfusion.com/common/essential-studio/release-notes/v34.1.29" rel="noopener noreferrer"&gt;2026 Volume 2&lt;/a&gt; release brings meaningful improvements to the &lt;a href="https://www.syncfusion.com/pdf-viewer-sdk" rel="noopener noreferrer"&gt;PDF Viewer SDK&lt;/a&gt; across Web, Blazor, and .NET MAUI platforms.&lt;/p&gt;

&lt;h3&gt;
  
  
  Web PDF Viewer
&lt;/h3&gt;

&lt;p&gt;Let’s first explore the latest improvements in the Web PDF Viewer:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Erase specific portions of ink annotations
&lt;/h4&gt;

&lt;p&gt;A small mistake in an ink annotation used to mean deleting the entire stroke and starting over.&lt;/p&gt;

&lt;p&gt;The new &lt;a href="https://help.syncfusion.com/document-processing/pdf/pdf-viewer/react/annotation/ink-eraser" rel="noopener noreferrer"&gt;ink eraser tool&lt;/a&gt; lets users erase only the part that needs fixing while keeping the rest intact.&lt;/p&gt;

&lt;p&gt;For developers, it’s flexible too. The eraser appears when users interact with ink annotations, can be controlled programmatically, and fits easily into custom setups, such as enabling it only in review mode or for specific user roles.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FInk-eraser-tool-in-the-Web-PDF-Viewer.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FInk-eraser-tool-in-the-Web-PDF-Viewer.gif" alt="Ink eraser tool in the Web PDF Viewer" width="760" height="364"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Ink eraser tool in the Web PDF Viewer
  &lt;p&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Filter annotation comments for focused review
&lt;/h4&gt;

&lt;p&gt;Once documents start accumulating feedback, the real problem isn’t adding comments; it’s navigating them.&lt;/p&gt;

&lt;p&gt;The new &lt;a href="https://help.syncfusion.com/document-processing/pdf/pdf-viewer/react/annotation/annotation-comment-filter" rel="noopener noreferrer"&gt;comment filtering&lt;/a&gt; option enables you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Filter annotation comments based on specific criteria and&lt;/li&gt;
&lt;li&gt;See those filtered results reflected directly in the document.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of building and synchronizing your own comment filtering logic with the document view, the behavior is already built in and consistent.&lt;/p&gt;

&lt;p&gt;It’s one of those features that directly improves usability without adding complexity to your implementation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FFiltering-annotation-comments-in-Web-PDF-Viewer.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FFiltering-annotation-comments-in-Web-PDF-Viewer.gif" alt="Filtering annotation comments in Web PDF Viewer" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Filtering annotation comments in Web PDF Viewer
  &lt;p&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Up to 92% faster downloads for annotation-heavy PDFs
&lt;/h4&gt;

&lt;p&gt;Downloads often stay fast at first, but as annotations grow, performance starts to drop. With hundreds of comments, even simple updates can feel slow.&lt;/p&gt;

&lt;p&gt;The Web PDF Viewer now makes download performance more predictable by improving annotation handling, especially in large, heavily annotated PDFs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does that mean in simple terms:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Small files → Slightly faster, smoother updates.&lt;/li&gt;
&lt;li&gt;Medium-sized documents → Noticeably quicker response.&lt;/li&gt;
&lt;li&gt;Large, heavily annotated PDFs → &lt;strong&gt;Massive speed improvement.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The following table shows the annotation download performance before and after optimization.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="386"&gt;&lt;strong&gt;Scenario&lt;/strong&gt;&lt;/td&gt;
&lt;td width="176"&gt;&lt;strong&gt;Previous performance&lt;/strong&gt;&lt;/td&gt;
&lt;td width="162"&gt;&lt;strong&gt;Current performance&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="386"&gt;Document with 1 annotation (updating 1 annotation)&lt;/td&gt;
&lt;td width="175"&gt;24.88 ms&lt;/td&gt;
&lt;td width="150"&gt;19.63 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="386"&gt;Document with 30 annotations (updating 1 annotation)&lt;/td&gt;
&lt;td width="175"&gt;54.53 ms&lt;/td&gt;
&lt;td width="150"&gt;26.72 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="388"&gt;Document with 400 annotations (updating 1 annotation)&lt;/td&gt;
&lt;td width="175"&gt;1,649.25 ms&lt;/td&gt;
&lt;td width="148"&gt;152.79 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For large documents, that’s up to &lt;strong&gt;&lt;code&gt;92%&lt;/code&gt;&lt;/strong&gt; &lt;strong&gt;faster&lt;/strong&gt;, while smaller ones see around &lt;strong&gt;&lt;code&gt;35%&lt;/code&gt;&lt;/strong&gt; &lt;strong&gt;improvement&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Blazor PDF Viewer
&lt;/h3&gt;

&lt;p&gt;While the Web PDF Viewer improvements focus on annotations and performance, the &lt;a href="https://www.syncfusion.com/pdf-viewer-sdk/blazor-pdf-viewer" rel="noopener noreferrer"&gt;Blazor PDF Viewer&lt;/a&gt; addresses a different challenge: making large documents easier to navigate.&lt;/p&gt;

&lt;p&gt;When users rely on bookmarks to move through lengthy reports or technical documents, formatting helps reinforce the document hierarchy. With 2026 Volume 2, &lt;a href="https://help.syncfusion.com/document-processing/pdf/pdf-viewer/blazor/interactive-pdf-navigation/bookmark" rel="noopener noreferrer"&gt;bookmark styling&lt;/a&gt; is now preserved in view-only mode.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Preserve original bookmark styling, including bold text.&lt;/li&gt;
&lt;li&gt;Maintain document structure and hierarchy.&lt;/li&gt;
&lt;li&gt;Improve navigation in large PDF files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FPreserving-bookmark-formatting-in-Blazor-PDF-Viewers-view-only-mode.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FPreserving-bookmark-formatting-in-Blazor-PDF-Viewers-view-only-mode.png" alt="Preserving bookmark formatting in Blazor PDF Viewer’s view-only mode" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Preserving bookmark formatting in Blazor PDF Viewer’s view-only mode
  &lt;p&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  .NET MAUI PDF Viewer
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://www.syncfusion.com/pdf-viewer-sdk/net-maui-pdf-viewer" rel="noopener noreferrer"&gt;.NET MAUI PDF Viewer&lt;/a&gt; includes the following practical improvements:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Disable or enable double-tap zoom programmatically
&lt;/h4&gt;

&lt;p&gt;On mobile devices, gestures can sometimes compete with each other. While double-tap zoom is useful in many scenarios, it may not fit apps that use custom navigation or selection interactions.&lt;/p&gt;

&lt;p&gt;You can now &lt;a href="https://help.syncfusion.com/document-processing/pdf/pdf-viewer/maui/magnification#enable-or-disable-double-tap-zoom" rel="noopener noreferrer"&gt;enable or disable double-tap zoom behavior&lt;/a&gt; programmatically, giving you more control over the viewing experience.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Disable double-tap zoom when using custom navigation or selection gestures.&lt;/li&gt;
&lt;li&gt;Enable it when document zooming is a priority.&lt;/li&gt;
&lt;li&gt;Integrate the behavior directly into your app’s functionality.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FDouble-tap-toggle-button-in-.NET-MAUI-PDF-Viewer.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FDouble-tap-toggle-button-in-.NET-MAUI-PDF-Viewer.png" alt="Double-tap toggle button in .NET MAUI PDF Viewer" width="780" height="411"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Double-tap toggle button in .NET MAUI PDF Viewer
  &lt;p&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Mark all form fields read-only using a single setting
&lt;/h4&gt;

&lt;p&gt;Not every document is meant to stay editable. For review, approval, or finalized documents, you can now mark &lt;a href="https://help.syncfusion.com/document-processing/pdf/pdf-viewer/maui/form-filling-edit#controlling-form-field-editing-at-the-viewer-level" rel="noopener noreferrer"&gt;all form fields as read-only&lt;/a&gt; using a single setting.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prevent accidental edits.&lt;/li&gt;
&lt;li&gt;Avoid field-by-field configuration.&lt;/li&gt;
&lt;li&gt;Keep form behavior consistent across the document.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes it easier to protect data and maintain document integrity.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FRead-only-form-fields-feature-in-.NET-MAUI-PDF-Viewer.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FRead-only-form-fields-feature-in-.NET-MAUI-PDF-Viewer.png" alt="Read-only form fields feature in .NET MAUI PDF Viewer" width="780" height="411"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Read-only form fields feature in .NET MAUI PDF Viewer
  &lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  DOCX Editor SDK
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://www.syncfusion.com/docx-editor-sdk" rel="noopener noreferrer"&gt;DOCX Editor SDK&lt;/a&gt; receives major improvements across Web and Blazor platforms.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Bidirectional character formatting for RTL/LTR documents
&lt;/h3&gt;

&lt;p&gt;For apps that generate legal contracts, government forms, or multilingual business documents, mixed RTL and LTR content can quickly lead to formatting inconsistencies and manual cleanup.&lt;/p&gt;

&lt;p&gt;The DOCX Editor lets you control text direction at the character level, making mixed-language editing more predictable and easier to manage.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set RTL or LTR formatting for specific text ranges.&lt;/li&gt;
&lt;li&gt;Edit RTL content without disrupting layout or cursor flow.&lt;/li&gt;
&lt;li&gt;Reduce manual fixes and styling workarounds.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FBi-directional-text-formatting-in-Web-and-Blazor-DOCX-Editor.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FBi-directional-text-formatting-in-Web-and-Blazor-DOCX-Editor.gif" alt="Bi-directional text formatting in Web and Blazor DOCX Editor" width="800" height="581"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Bi-directional text formatting in Web and Blazor DOCX Editor
  &lt;p&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Enhanced hash computation with Algorithm SID
&lt;/h3&gt;

&lt;p&gt;If you’ve worked with protected Word documents, you’ve probably run into cases where password validation fails for no obvious reason, especially when files come from newer Word versions. Most of the time, it comes down to outdated hashing behavior.&lt;/p&gt;

&lt;p&gt;This update brings that layer up to date.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;ComputeHash&lt;/strong&gt; API now supports &lt;strong&gt;Algorithm SID&lt;/strong&gt;, enabling the use of modern hashing algorithms such as &lt;strong&gt;SHA-1 and SHA-256&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More reliable &lt;strong&gt;password validation&lt;/strong&gt; when opening or verifying documents.&lt;/li&gt;
&lt;li&gt;Better compatibility with &lt;strong&gt;documents generated by newer Word clients.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Fewer edge-case failures in &lt;strong&gt;protection and unprotection scenarios.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With text handling and document security tightened up, the next set of updates shifts focus toward handling large datasets more efficiently in the Spreadsheet Editor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Spreadsheet Editor SDK
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://www.syncfusion.com/spreadsheet-editor-sdk" rel="noopener noreferrer"&gt;Spreadsheet Editor SDK&lt;/a&gt; also receives major improvements across Web and Blazor platforms.&lt;/p&gt;

&lt;h3&gt;
  
  
  Web Spreadsheet Editor
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Spreadsheet operations via natural language with AI Assist
&lt;/h4&gt;

&lt;p&gt;The Web Spreadsheet Editor includes &lt;a href="https://document.syncfusion.com/demos/spreadsheet-editor/react/#/tailwind3/spreadsheet/default" rel="noopener noreferrer"&gt;AI Assist with natural language capabilities&lt;/a&gt;, making common spreadsheet tasks much easier.&lt;/p&gt;

&lt;p&gt;Instead of repeating routine tasks like writing formulas or cleaning data, you can simply describe what you need.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Type your request in plain language and see it applied instantly.&lt;/li&gt;
&lt;li&gt;Handle editing, formatting, analysis, and visualizations from a single prompt.&lt;/li&gt;
&lt;li&gt;Stay in control with built-in prompt suggestions and full undo/redo support.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No need to switch between menus or write formulas; just ask and get it done.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FWeb-Spreadsheet-Editor-SDK-with-AI-Assist-support.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FWeb-Spreadsheet-Editor-SDK-with-AI-Assist-support.gif" alt="Web Spreadsheet Editor SDK with AI Assist support" width="760" height="414"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Web Spreadsheet Editor SDK with AI Assist support
  &lt;p&gt;&lt;/p&gt;

&lt;p&gt;Read the full blog post on the &lt;a href="https://www.syncfusion.com/blogs/post/document-editor-sdks-2026-volume-2" rel="noopener noreferrer"&gt;Syncfusion Website&lt;/a&gt;&lt;/p&gt;

</description>
      <category>syncfusion</category>
      <category>netdevelopment</category>
      <category>blazordevelopment</category>
      <category>documentprocessing</category>
    </item>
    <item>
      <title>What’s New in Syncfusion Essential Studio 2026 Volume 2: AI Features, New SDKs, and Faster Components</title>
      <dc:creator>Lucy Muturi</dc:creator>
      <pubDate>Mon, 06 Jul 2026 13:22:20 +0000</pubDate>
      <link>https://dev.to/syncfusion/whats-new-in-syncfusion-essential-studio-2026-volume-2-ai-features-new-sdks-and-faster-2doj</link>
      <guid>https://dev.to/syncfusion/whats-new-in-syncfusion-essential-studio-2026-volume-2-ai-features-new-sdks-and-faster-2doj</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Syncfusion Essential Studio 2026 Volume 2 marks one of our biggest releases yet, featuring AI-powered developer tools, dedicated SDK packages, new UI controls, and major performance improvements across web, desktop, mobile, and document-processing platforms. Whether you’re building intelligent applications, enterprise dashboards, or document automation solutions, this release gives you everything you need to build smarter, faster, and with greater confidence.&lt;/p&gt;

&lt;p&gt;Syncfusion &lt;a href="https://help.syncfusion.com/common/essential-studio/release-notes/v34.1.29" rel="noopener noreferrer"&gt;Essential Studio 2026 Volume 2&lt;/a&gt; is now available, bringing new controls, AI-powered enhancements, performance upgrades, and productivity improvements across web, mobile, desktop, and document processing platforms.&lt;/p&gt;

&lt;p&gt;This release arrives at a time when developers are expected to build smarter applications, automate more document workflows, support multiple platforms, and still deliver fast, polished user experiences. Essential Studio 2026 Volume 2 is designed to help with exactly that: giving teams practical tools that reduce repetitive work and make modern application development easier.&lt;/p&gt;

&lt;p&gt;From AI-assisted user experiences and smarter document processing to front-end framework improvements and performance-focused updates, this release helps you build powerful applications with more speed and flexibility.&lt;/p&gt;

&lt;p&gt;Here is a closer look at what is new in this release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Release highlights
&lt;/h2&gt;

&lt;p&gt;Essential Studio 2026 Volume 2 focuses on helping developers build faster, smarter, and more capable applications across web, mobile, desktop, and document processing scenarios.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New .NET Markdown Library in preview&lt;/li&gt;
&lt;li&gt;New Inline AI Assist component for Blazor&lt;/li&gt;
&lt;li&gt;AI-powered Agent Tools for Document SDK&lt;/li&gt;
&lt;li&gt;Expanded Pure React Components ecosystem&lt;/li&gt;
&lt;li&gt;Production-ready Sankey Diagram&lt;/li&gt;
&lt;li&gt;Major Blazor productivity enhancements&lt;/li&gt;
&lt;li&gt;AI-powered Spreadsheet editing&lt;/li&gt;
&lt;li&gt;Significant PDF Viewer performance improvements&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  New dedicated SDK packages
&lt;/h2&gt;

&lt;p&gt;This release also introduces a new generation of dedicated Syncfusion SDK packages. These focused offerings give teams more flexibility to choose the capabilities they need, such as &lt;a href="https://www.syncfusion.com/grid-sdk" rel="noopener noreferrer"&gt;Grid SDK&lt;/a&gt;, &lt;a href="https://www.syncfusion.com/chart-sdk" rel="noopener noreferrer"&gt;Chart SDK&lt;/a&gt;, &lt;a href="https://www.syncfusion.com/scheduler-sdk" rel="noopener noreferrer"&gt;Scheduler SDK&lt;/a&gt;, &lt;a href="https://www.syncfusion.com/gantt-sdk" rel="noopener noreferrer"&gt;Gantt SDK&lt;/a&gt;, &lt;a href="https://www.syncfusion.com/file-manager-sdk" rel="noopener noreferrer"&gt;File Manager SDK&lt;/a&gt;, &lt;a href="https://www.syncfusion.com/rich-text-editor-sdk" rel="noopener noreferrer"&gt;Rich Text Editor SDK&lt;/a&gt;, and &lt;a href="https://www.syncfusion.com/diagram-sdk" rel="noopener noreferrer"&gt;Diagram SDK&lt;/a&gt;, instead of purchasing a larger component suite when a focused SDK is a better fit.&lt;/p&gt;

&lt;p&gt;Explore our dedicated &lt;a href="https://www.syncfusion.com/blogs/post/syncfusion-standalone-ui-sdks" rel="noopener noreferrer"&gt;SDK announcement blog&lt;/a&gt; to learn more about choosing the right SDK for your development needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  New controls
&lt;/h2&gt;

&lt;p&gt;Essential Studio 2026 Volume 2 introduces new controls built for emerging development scenarios, including AI-assisted applications, intelligent content generation, and automated document processing.&lt;/p&gt;

&lt;h3&gt;
  
  
  .NET Markdown Library (Preview)
&lt;/h3&gt;

&lt;p&gt;The new &lt;a href="https://www.syncfusion.com/document-sdk/net-markdown-library" rel="noopener noreferrer"&gt;.NET Markdown Library&lt;/a&gt; allows developers to create, edit, and convert Markdown documents programmatically without relying on external dependencies.&lt;/p&gt;

&lt;p&gt;With this library, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create Markdown documents using a structured DOM, making content generation easier to manage in code.&lt;/li&gt;
&lt;li&gt;Add headings, lists, tables, checkboxes, images, and hyperlinks for dynamic content creation systems.&lt;/li&gt;
&lt;li&gt;Apply formatting such as bold, italic, strikethrough, superscript, and subscript.&lt;/li&gt;
&lt;li&gt;Insert code blocks and formatted content for technical documentation and automated publishing workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The library also includes document conversion capabilities, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Markdown to Word for editable document outputs.&lt;/li&gt;
&lt;li&gt;Markdown to Excel for converting structured content into spreadsheet-based documents.&lt;/li&gt;
&lt;li&gt;Markdown to PowerPoint for generating presentation-ready content.&lt;/li&gt;
&lt;li&gt;Markdown to PDF for creating final, shareable document outputs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FNET-Markdown-Library.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FNET-Markdown-Library.webp" alt=".NET Markdown Library" width="800" height="314"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;.NET Markdown Library
  &lt;p&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Inline AI Assist for Blazor
&lt;/h3&gt;

&lt;p&gt;The new &lt;a href="https://www.syncfusion.com/blazor-components/blazor-inline-ai-assist" rel="noopener noreferrer"&gt;Inline AI Assist for Blazor&lt;/a&gt; helps you bring AI-powered interactions directly into your application experience, without forcing users into a separate chat interface.&lt;/p&gt;

&lt;p&gt;Key capabilities include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inline and pop-up AI interaction modes for flexible placement across application layouts.&lt;/li&gt;
&lt;li&gt;Streaming AI responses for more natural, real-time AI experiences.&lt;/li&gt;
&lt;li&gt;Prompt-based intelligent interactions for contextual AI-powered workflows.&lt;/li&gt;
&lt;li&gt;AI-assisted content generation for writing assistants, copilots, and productivity tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes it easier to build AI-native applications where assistance appears naturally within the user workflow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FInline-AI-Assist-for-Blazor.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FInline-AI-Assist-for-Blazor.gif" alt="Inline AI Assist for Blazor" width="768" height="636"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Inline AI Assist for Blazor
  &lt;p&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Markdown Viewer for WinUI
&lt;/h3&gt;

&lt;p&gt;The new &lt;a href="https://www.syncfusion.com/winui-controls/markdown-viewer" rel="noopener noreferrer"&gt;Markdown Viewer&lt;/a&gt; control for WinUI makes it easier to render rich Markdown content directly inside desktop applications, without external rendering libraries or manual formatting.&lt;/p&gt;

&lt;p&gt;Key features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rich Markdown rendering for headings, lists, links, images, tables, code blocks, and other content elements.&lt;/li&gt;
&lt;li&gt;Support for loading Markdown content from strings, files, or URLs.&lt;/li&gt;
&lt;li&gt;Hyperlink navigation and content customization options for documentation, help systems, and content-driven desktop applications.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FWinUI-Markdown-Viewer-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FWinUI-Markdown-Viewer-1.png" alt="WinUI Markdown Viewer" width="799" height="444"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;WinUI Markdown Viewer
  &lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Feature enhancements across platforms
&lt;/h2&gt;

&lt;p&gt;Along with new controls, this release brings meaningful improvements across multiple platforms and development frameworks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Web
&lt;/h3&gt;

&lt;p&gt;For &lt;a href="https://www.syncfusion.com/react-components" rel="noopener noreferrer"&gt;React&lt;/a&gt;, &lt;a href="https://www.syncfusion.com/javascript-ui-controls" rel="noopener noreferrer"&gt;JavaScript&lt;/a&gt;, &lt;a href="https://www.syncfusion.com/angular-components" rel="noopener noreferrer"&gt;Angular&lt;/a&gt;, &lt;a href="https://www.syncfusion.com/vue-components" rel="noopener noreferrer"&gt;Vue&lt;/a&gt;, &lt;a href="https://www.syncfusion.com/aspnet-core-ui-controls" rel="noopener noreferrer"&gt;ASP.NET Core&lt;/a&gt;, and &lt;a href="https://www.syncfusion.com/aspnet-mvc-ui-controls" rel="noopener noreferrer"&gt;ASP.NET MVC&lt;/a&gt;, this release delivers richer interactions, better customization, and improved performance for modern front-end applications.&lt;/p&gt;

&lt;h4&gt;
  
  
  Better theming architecture
&lt;/h4&gt;

&lt;p&gt;Theme management is easier to maintain in large front-end applications with the latest theming architecture improvements. Updates include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modular theme architecture for simpler long-term styling maintenance.&lt;/li&gt;
&lt;li&gt;Centralized theme packages for improved consistency across projects.&lt;/li&gt;
&lt;li&gt;Dedicated &lt;strong&gt;index.css&lt;/strong&gt; and &lt;strong&gt;index.scss&lt;/strong&gt; entry points for cleaner stylesheet management.&lt;/li&gt;
&lt;li&gt;Sass 1.100.0 upgrade for better compatibility and modern styling support.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These updates help teams manage design systems more cleanly at scale.&lt;/p&gt;

&lt;h4&gt;
  
  
  Expanded Pure React Components ecosystem
&lt;/h4&gt;

&lt;p&gt;The &lt;a href="https://react.syncfusion.com/react-ui/overview/introduction/" rel="noopener noreferrer"&gt;Pure React Components&lt;/a&gt; ecosystem continues to expand, giving React developers more framework-native components and greater flexibility.&lt;/p&gt;

&lt;p&gt;New additions include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.syncfusion.com/react-components/menu" rel="noopener noreferrer"&gt;Menu&lt;/a&gt; component for advanced navigation and contextual menus.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.syncfusion.com/react-components/switch" rel="noopener noreferrer"&gt;Switch&lt;/a&gt; component for modern toggle-based interactions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Several Pure React components are now production-ready, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.syncfusion.com/react-components/charts" rel="noopener noreferrer"&gt;Chart&lt;/a&gt; for advanced data visualization.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.syncfusion.com/react-components/data-grid" rel="noopener noreferrer"&gt;Data Grid&lt;/a&gt; for enterprise-grade data management interfaces.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.syncfusion.com/react-components/button" rel="noopener noreferrer"&gt;Buttons&lt;/a&gt;, &lt;a href="https://react.syncfusion.com/react-ui/form/" rel="noopener noreferrer"&gt;Forms&lt;/a&gt;, Inputs, and Dropdowns for richer application interactions.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.syncfusion.com/react-components/toolbar" rel="noopener noreferrer"&gt;Toolbar&lt;/a&gt;, &lt;a href="https://www.syncfusion.com/react-components/dialog" rel="noopener noreferrer"&gt;Dialog&lt;/a&gt;, &lt;a href="https://www.syncfusion.com/react-components/tooltip" rel="noopener noreferrer"&gt;Tooltip&lt;/a&gt;, &lt;a href="https://www.syncfusion.com/react-components/toast" rel="noopener noreferrer"&gt;Toast&lt;/a&gt;, &lt;a href="https://react.syncfusion.com/react-ui/spinner/" rel="noopener noreferrer"&gt;Spinner&lt;/a&gt;, and &lt;a href="https://www.syncfusion.com/react-components/skeleton" rel="noopener noreferrer"&gt;Skeleton&lt;/a&gt; for building interactive applications.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additional support now includes Tailwind CSS integration and Bootstrap support, helping teams work faster with popular styling approaches.&lt;/p&gt;

&lt;h4&gt;
  
  
  More web component improvements
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.syncfusion.com/javascript-ui-controls/js-data-grid" rel="noopener noreferrer"&gt;Data Grid&lt;/a&gt;:&lt;/strong&gt; Adds grouping and master-detail views, infinite scrolling, conditional selection, context menus, row and column spanning, PDF export, and print support for advanced enterprise data applications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.syncfusion.com/javascript-ui-controls/js-ai-assistview" rel="noopener noreferrer"&gt;AI AssistView&lt;/a&gt;:&lt;/strong&gt; Adds response regeneration, reasoning-process visibility, text-to-speech, dynamic generative UI components, and tool invocation through system prompts for more adaptive AI-powered interfaces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.syncfusion.com/javascript-ui-controls/js-charts" rel="noopener noreferrer"&gt;Chart&lt;/a&gt;:&lt;/strong&gt; Adds inline tooltip formatting, multi-level donut charts, and new stock chart series types such as Spline, Spline Area, and Column for richer data visualizations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.syncfusion.com/javascript-ui-controls/js-pivot-table" rel="noopener noreferrer"&gt;Pivot Table&lt;/a&gt;:&lt;/strong&gt; Adds native CRUD operations, Top N and Bottom N filtering, incremental filtering, and percentage running totals for faster, more flexible analysis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.syncfusion.com/javascript-ui-controls/js-sankey" rel="noopener noreferrer"&gt;Sankey Diagram&lt;/a&gt;:&lt;/strong&gt; Now production-ready for process mapping, resource tracking, energy flow diagrams, and financial analysis visualizations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FSankey.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FSankey.gif" alt="JavaScript Sankey Diagram" width="560" height="238"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;JavaScript Sankey Diagram
  &lt;p&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Blazor
&lt;/h3&gt;

&lt;p&gt;This release includes major &lt;a href="https://www.syncfusion.com/blazor-components" rel="noopener noreferrer"&gt;Blazor&lt;/a&gt; enhancements that help you build smarter AI-powered applications, improve developer productivity, and deliver richer enterprise experiences.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.syncfusion.com/blazor-components/blazor-ai-assistview" rel="noopener noreferrer"&gt;AI AssistView&lt;/a&gt;:&lt;/strong&gt; Adds speech-to-text support, response regeneration with navigation controls, and text-to-speech support, making AI-powered chat experiences more interactive and accessible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FSpeech-to-text-conversion-in-Blazor-AI-AssistView.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FSpeech-to-text-conversion-in-Blazor-AI-AssistView.png" alt="Speech-to-text conversion in Blazor AI AssistView" width="648" height="712"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Speech-to-text conversion in Blazor AI AssistView
  &lt;p&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.syncfusion.com/blazor-components/blazor-datagrid" rel="noopener noreferrer"&gt;DataGrid&lt;/a&gt;:&lt;/strong&gt; Introduces single-click batch editing for faster data entry and an adaptive filter bar that adjusts based on text, numeric, date, and Boolean column types.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FSingle-click-batch-edit-feature-in-Blazor-DataGrid.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FSingle-click-batch-edit-feature-in-Blazor-DataGrid.gif" alt="Single-click batch edit feature in Blazor DataGrid" width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Single-click batch edit feature in Blazor DataGrid
  &lt;p&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.syncfusion.com/diagram-sdk/blazor-diagram" rel="noopener noreferrer"&gt;Diagram&lt;/a&gt;:&lt;/strong&gt; Adds support for UML class diagrams, annotation interactions such as dragging, resizing, and rotation, and hyperlink support for advanced visual modeling applications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.syncfusion.com/rich-text-editor-sdk/blazor-rich-text-editor" rel="noopener noreferrer"&gt;Rich Text Editor&lt;/a&gt;:&lt;/strong&gt; Adds image wrap support directly from the quick toolbar and chunk message handling for efficiently processing large HTML content.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together, these updates help teams build richer Blazor applications with less effort.&lt;/p&gt;

&lt;h3&gt;
  
  
  .NET MAUI
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://www.syncfusion.com/maui-controls" rel="noopener noreferrer"&gt;.NET MAUI&lt;/a&gt; updates in this release help developers build richer cross-platform applications across mobile and desktop environments.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.syncfusion.com/maui-controls/maui-ai-assistview" rel="noopener noreferrer"&gt;AI AssistView&lt;/a&gt;:&lt;/strong&gt; Adds agent switching, multi-line input, image previews, and time-based conversation grouping for Copilot-style experiences inside your applications.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FNET-MAUI-AI-AssistView-with-agent-picker-in-editor.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FNET-MAUI-AI-AssistView-with-agent-picker-in-editor.gif" alt=".NET MAUI AI AssistView with agent picker in editor" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;.NET MAUI AI AssistView with agent picker in editor
  &lt;p&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.syncfusion.com/maui-controls/maui-cartesian-charts" rel="noopener noreferrer"&gt;Charts&lt;/a&gt;:&lt;/strong&gt; Adds per-point color mapping and real-time updates through property change listening, giving you more control over analytics and visualization scenarios.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FPer-point-color-mapping-in-.NET-MAUI-Charts.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FPer-point-color-mapping-in-.NET-MAUI-Charts.png" alt="Per-point color mapping in .NET MAUI Charts" width="800" height="389"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Per-point color mapping in .NET MAUI Charts
  &lt;p&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.syncfusion.com/maui-controls/maui-datagrid" rel="noopener noreferrer"&gt;DataGrid&lt;/a&gt;:&lt;/strong&gt; Adds undo and redo support, multi-row drag-and-drop, row resizing, and built-in search UI to improve enterprise data management and large dataset handling.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FMulti-row-drag-and-drop-feature-in-.NET-MAUI-DataGrid.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FMulti-row-drag-and-drop-feature-in-.NET-MAUI-DataGrid.gif" alt="Multi-row drag-and-drop feature in .NET MAUI DataGrid" width="800" height="558"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Multi-row drag-and-drop feature in .NET MAUI DataGrid
  &lt;p&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.syncfusion.com/scheduler-sdk/maui-scheduler" rel="noopener noreferrer"&gt;Scheduler&lt;/a&gt; and &lt;a href="https://www.syncfusion.com/rich-text-editor-sdk/maui-rich-text-editor" rel="noopener noreferrer"&gt;Rich Text Editor&lt;/a&gt;:&lt;/strong&gt; Adds improvements for scheduling, event management, calendar interactions, rich content editing, formatting, and customization.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These improvements help you deliver better experiences across devices while keeping cross-platform development efficient.&lt;/p&gt;

&lt;p&gt;Read the full blog post on the &lt;a href="https://www.syncfusion.com/blogs/post/syncfusion-essential-studio-2026-vol-2" rel="noopener noreferrer"&gt;Syncfusion Website&lt;/a&gt;&lt;/p&gt;

</description>
      <category>syncfusion</category>
      <category>ai</category>
      <category>desktop</category>
      <category>documentprocessing</category>
    </item>
    <item>
      <title>Introducing Standalone UI SDKs: Choose Only What Your Application Needs</title>
      <dc:creator>Lucy Muturi</dc:creator>
      <pubDate>Mon, 06 Jul 2026 09:31:18 +0000</pubDate>
      <link>https://dev.to/syncfusion/introducing-standalone-ui-sdks-choose-only-what-your-application-needs-2ci</link>
      <guid>https://dev.to/syncfusion/introducing-standalone-ui-sdks-choose-only-what-your-application-needs-2ci</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Syncfusion Essential Studio 2026 Volume 2 introduces Standalone UI SDKs, giving you the flexibility to license focused UI toolkits such as Grid, Chart, Scheduler, File Manager, Diagram, Gantt, and Rich Text Editor SDKs. Whether you need a specialized SDK or the complete UI Component Suite, you can choose the option that best fits your application’s architecture while continuing to build with the same trusted Syncfusion components, APIs, documentation, and support.&lt;/p&gt;

&lt;p&gt;Modern applications are no longer built with one-size-fits-all requirements.&lt;/p&gt;

&lt;p&gt;Some teams are building data-heavy enterprise portals. Others are creating analytics dashboards, file management systems, scheduling platforms, workflow designers, project planning tools, or rich content editing experiences.&lt;/p&gt;

&lt;p&gt;While many development teams still need a complete UI component suite, some projects are focused on one specific capability. In those cases, purchasing a broad component suite may not always be the most efficient path.&lt;/p&gt;

&lt;p&gt;To give developers more flexibility, Syncfusion is introducing a new set of Standalone UI SDKs with the &lt;a href="https://help.syncfusion.com/common/essential-studio/release-notes/v34.1.29" rel="noopener noreferrer"&gt;Essential Studio&lt;sup&gt;®&lt;/sup&gt; 2026 Volume 2&lt;/a&gt; release.&lt;/p&gt;

&lt;p&gt;These focused SDK packages allow teams to choose the UI capabilities their applications need, while continuing to build with the same trusted Syncfusion components, consistent APIs, documentation, performance, and professional support.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s new in this release?
&lt;/h2&gt;

&lt;p&gt;Starting with the &lt;a href="https://help.syncfusion.com/common/essential-studio/release-notes/v34.1.29" rel="noopener noreferrer"&gt;2026 Volume 2&lt;/a&gt; release, Syncfusion now offers the following Standalone UI SDKs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/grid-sdk" rel="noopener noreferrer"&gt;Grid SDK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/chart-sdk" rel="noopener noreferrer"&gt;Chart SDK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/scheduler-sdk" rel="noopener noreferrer"&gt;Scheduler SDK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/gantt-sdk" rel="noopener noreferrer"&gt;Gantt SDK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/rich-text-editor-sdk" rel="noopener noreferrer"&gt;Rich Text Editor SDK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/diagram-sdk" rel="noopener noreferrer"&gt;Diagram SDK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/file-manager-sdk" rel="noopener noreferrer"&gt;File Manager SDK&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These SDKs are designed to complement the Syncfusion UI Component Suite. You can choose a focused SDK when your application has a specific requirement, or choose the UI Component Suite when your project needs a broader collection of enterprise-ready UI components.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Existing Syncfusion customers are not affected. Current product entitlements remain unchanged, and existing customers will continue to receive the products included with their subscription.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Standalone UI SDKs?
&lt;/h2&gt;

&lt;p&gt;Every application has a different center of gravity.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For a business intelligence application, charts and dashboards may be the core experience.&lt;/li&gt;
&lt;li&gt;For an ERP system, data grids and pivot tables may matter most.&lt;/li&gt;
&lt;li&gt;For a booking platform, scheduling is the priority.&lt;/li&gt;
&lt;li&gt;For a workflow automation tool, diagrams may be essential.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Standalone UI SDKs make it easier to choose a product based on what your application is actually built around.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Choose a Standalone UI SDK when your application focuses on a specific UI capability.&lt;/li&gt;
&lt;li&gt;Choose the UI Component Suite when your application requires a broader set of components across multiple functional areas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This gives development teams more control over product selection, licensing, and long-term scalability without changing the Syncfusion development experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meet the new Standalone UI SDKs
&lt;/h2&gt;

&lt;p&gt;Each Standalone UI SDK is built around a focused application scenario and includes the components commonly required for that type of solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Grid SDK
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://www.syncfusion.com/grid-sdk" rel="noopener noreferrer"&gt;Grid SDK&lt;/a&gt; is designed for applications that need to display, manage, edit, and analyze structured data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Includes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DataGrid&lt;/li&gt;
&lt;li&gt;TreeGrid&lt;/li&gt;
&lt;li&gt;Pivot Table&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ideal for:&lt;/strong&gt; ERP systems, CRM platforms, financial applications, inventory management systems, admin portals, reporting interfaces, and data-heavy enterprise applications.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FGrid-SDK.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FGrid-SDK.gif" alt="Grid SDK" width="650" height="476"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Grid SDK
  &lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Chart SDK
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://www.syncfusion.com/chart-sdk" rel="noopener noreferrer"&gt;Chart SDK&lt;/a&gt; is built for dashboards, analytics applications, and interactive data visualization experiences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Includes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2D and 3D Charts&lt;/li&gt;
&lt;li&gt;Circular Charts&lt;/li&gt;
&lt;li&gt;Stock Chart&lt;/li&gt;
&lt;li&gt;Sankey Diagram&lt;/li&gt;
&lt;li&gt;HeatMap&lt;/li&gt;
&lt;li&gt;TreeMap&lt;/li&gt;
&lt;li&gt;Maps&lt;/li&gt;
&lt;li&gt;Gauges&lt;/li&gt;
&lt;li&gt;Sparkline&lt;/li&gt;
&lt;li&gt;Barcode Generator&lt;/li&gt;
&lt;li&gt;Range Selector&lt;/li&gt;
&lt;li&gt;Smith Chart&lt;/li&gt;
&lt;li&gt;Bullet Chart&lt;/li&gt;
&lt;li&gt;Dashboard Layout&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ideal for:&lt;/strong&gt; Business intelligence dashboards, analytics platforms, monitoring systems, financial dashboards, reporting tools, and data visualization applications.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FChart-SDK.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FChart-SDK.gif" alt="Chart SDK" width="716" height="299"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Chart SDK
  &lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Scheduler SDK
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://www.syncfusion.com/scheduler-sdk" rel="noopener noreferrer"&gt;Scheduler SDK&lt;/a&gt; is designed for applications that need calendar, appointment, and resource scheduling capabilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Includes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scheduler&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ideal for:&lt;/strong&gt; Healthcare appointment systems, booking platforms, workforce management tools, education portals, event management applications, and calendar-based business solutions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FScheduler-SDK.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FScheduler-SDK.png" alt="Scheduler SDK" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Scheduler SDK
  &lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Gantt SDK
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://www.syncfusion.com/gantt-sdk" rel="noopener noreferrer"&gt;Gantt SDK&lt;/a&gt; is designed for project planning, timeline management, and task tracking applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Includes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gantt Chart&lt;/li&gt;
&lt;li&gt;Kanban&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ideal for:&lt;/strong&gt; Project management systems, agile planning tools, resource management applications, task tracking platforms, and work planning solutions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FGantt-SDK.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FGantt-SDK.gif" alt="Gantt SDK" width="644" height="473"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Gantt SDK
  &lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Rich Text Editor SDK
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://www.syncfusion.com/rich-text-editor-sdk" rel="noopener noreferrer"&gt;Rich Text Editor SDK&lt;/a&gt; helps developers build modern content creation and editing experiences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Includes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rich Text Editor&lt;/li&gt;
&lt;li&gt;Block Editor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ideal for:&lt;/strong&gt; Content management systems, blogging platforms, documentation tools, knowledge bases, email composition experiences, and collaborative content editing applications.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FRich-Text-Editor-SDK.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FRich-Text-Editor-SDK.png" alt="Rich Text Editor SDK" width="800" height="585"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Rich Text Editor SDK
  &lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Diagram SDK
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://www.syncfusion.com/diagram-sdk" rel="noopener noreferrer"&gt;Diagram SDK&lt;/a&gt; helps developers create interactive diagramming, visualization, and workflow design experiences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Includes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Diagram&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ideal for:&lt;/strong&gt; Flowcharts, BPMN diagrams, organizational charts, workflow builders, network diagrams, process visualization tools, and visual modeling applications.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FDiagram-SDK.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FDiagram-SDK.gif" alt="Diagram SDK" width="800" height="544"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Diagram SDK
  &lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  File Manager SDK
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://www.syncfusion.com/file-manager-sdk" rel="noopener noreferrer"&gt;File Manager SDK&lt;/a&gt; helps developers build secure and intuitive file and folder management experiences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Includes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;File Manager&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ideal for:&lt;/strong&gt; Document management systems, digital asset management platforms, cloud storage applications, enterprise portals, and internal file operation tools.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FFile-Manager-SDK.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FFile-Manager-SDK.gif" alt="File Manager SDK" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;File Manager SDK
  &lt;p&gt;&lt;/p&gt;

&lt;p&gt;Read the full blog post on the &lt;a href="https://www.syncfusion.com/blogs/post/syncfusion-standalone-ui-sdks" rel="noopener noreferrer"&gt;Syncfusion Website&lt;/a&gt;&lt;/p&gt;

</description>
      <category>whatsnew</category>
      <category>releaseupdates</category>
      <category>standaloneuisdks</category>
      <category>chartsdk</category>
    </item>
    <item>
      <title>How to Add Custom Filtering, Sorting, and Grouping Logic in WPF DataGrid</title>
      <dc:creator>Lucy Muturi</dc:creator>
      <pubDate>Fri, 03 Jul 2026 11:14:18 +0000</pubDate>
      <link>https://dev.to/syncfusion/how-to-add-custom-filtering-sorting-and-grouping-logic-in-wpf-datagrid-4o42</link>
      <guid>https://dev.to/syncfusion/how-to-add-custom-filtering-sorting-and-grouping-logic-in-wpf-datagrid-4o42</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Learn how to implement custom filtering, sorting, grouping, and column visibility in a WPF DataGrid using the MVVM pattern. Using a school grade management application as an example, this guide demonstrates how to build a responsive, data-driven interface that helps users efficiently organize, analyze, and manage large datasets.&lt;/p&gt;

&lt;p&gt;Modern desktop applications often need more than just displaying data. Users expect powerful capabilities such as filtering records, sorting information, grouping related data, and customizing column visibility to quickly analyze large datasets.&lt;/p&gt;

&lt;p&gt;Rather than building these features from scratch, you can leverage the WPF DataGrid together with the MVVM pattern to create rich and interactive data-management experiences.&lt;/p&gt;

&lt;p&gt;In this guide, we’ll use a school grade management system as a practical example to demonstrate how to implement &lt;a href="https://help.syncfusion.com/wpf/datagrid/sorting" rel="noopener noreferrer"&gt;sorting&lt;/a&gt;, &lt;a href="https://help.syncfusion.com/wpf/datagrid/filtering" rel="noopener noreferrer"&gt;filtering&lt;/a&gt;, and &lt;a href="https://help.syncfusion.com/wpf/datagrid/grouping" rel="noopener noreferrer"&gt;grouping&lt;/a&gt; in a Syncfusion&lt;sup&gt;®&lt;/sup&gt; &lt;a href="https://www.syncfusion.com/wpf-controls/datagrid" rel="noopener noreferrer"&gt;WPF DataGrid&lt;/a&gt; and a clean MVVM approach.&lt;/p&gt;

&lt;p&gt;Let’s get started.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Define data model
&lt;/h2&gt;

&lt;p&gt;Start by creating a model that represents individual student records, as shown in the following code example.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Grade&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;INotifyPropertyChanged&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;_studentName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;_subjectName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;_assignmentScore&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;_quizScore&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;_examScore&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;_projectScore&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;_comments&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;get&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;set&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nf"&gt;OnPropertyChanged&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;nameof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="err"&gt;…&lt;/span&gt;
    &lt;span class="err"&gt;…&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;event&lt;/span&gt; &lt;span class="n"&gt;PropertyChangedEventHandler&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;PropertyChanged&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;OnPropertyChanged&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;propertyName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;PropertyChanged&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;Invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;PropertyChangedEventArgs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;propertyName&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;CalculateFinalGrade&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Simple example calculation. Real-world grading systems often use weighted score calculations based on academic requirements.&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AssignmentScore&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;QuizScore&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ExamScore&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ProjectScore&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Create the ViewModel
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;&lt;code&gt;ViewModel&lt;/code&gt;&lt;/strong&gt; ties everything together by storing data, defining grid columns, and handling user interactions. In this step, we’ll create the &lt;strong&gt;&lt;code&gt;GradeSheetViewModel&lt;/code&gt;&lt;/strong&gt; class to populate the Grades collection for &lt;strong&gt;&lt;code&gt;ItemsSource&lt;/code&gt;&lt;/strong&gt; binding, configure column definitions, and implement data manipulation logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GradeSheetViewModel&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;INotifyPropertyChanged&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;ObservableCollection&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Grade&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;grades&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;ObservableCollection&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Grade&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Grades&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;get&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;grades&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;set&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;grades&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nf"&gt;OnPropertyChanged&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;nameof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Grades&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;    
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To populate the grades collection with default student data, refer to the code example below.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;PopulateCollection&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Grades&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ObservableCollection&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Grade&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class="c1"&gt;//Add sample data here&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configure DataGrid columns
&lt;/h3&gt;

&lt;p&gt;Instead of auto-generating columns, explicitly defining them gives you full control over how data is displayed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;InitializeColumns&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;columns&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Columns&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;studentNameIdUnboundColumn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;GridUnBoundColumn&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;MappingName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"StudentID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;HeaderText&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Student ID"&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="err"&gt;…&lt;/span&gt;
    &lt;span class="err"&gt;…&lt;/span&gt;
    &lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gradeColumn&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;commentsColumn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;GridTextColumn&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;MappingName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Comments"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;HeaderText&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Comments"&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;commentsColumn&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can add columns to the  &lt;strong&gt;Columns&lt;/strong&gt; collection using specialized objects like &lt;strong&gt;&lt;code&gt;GridTextColumn&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;GridNumericColumn&lt;/code&gt;&lt;/strong&gt;, chosen based on your data type requirements.&lt;/p&gt;

&lt;p&gt;Each column requires two key properties:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MappingName&lt;/strong&gt;: Specifies which data source property the column binds to.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HeaderText&lt;/strong&gt;: Defines the column’s display title.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 3: Design the UI
&lt;/h2&gt;

&lt;p&gt;Bind the XAML UI to the ViewModel and use the Columns property to connect the DataGrid with column definitions, ensuring it updates dynamically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;XAML&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;syncfusion:SfDataGrid&lt;/span&gt; &lt;span class="na"&gt;ItemsSource=&lt;/span&gt;&lt;span class="s"&gt;"{Binding Grades}"&lt;/span&gt;
                       &lt;span class="na"&gt;Columns=&lt;/span&gt;&lt;span class="s"&gt;"{Binding Columns}"&lt;/span&gt;
                       &lt;span class="na"&gt;AutoGenerateColumnsMode=&lt;/span&gt;&lt;span class="s"&gt;"None"&lt;/span&gt;
                       &lt;span class="na"&gt;AllowTriStateSorting=&lt;/span&gt;&lt;span class="s"&gt;"True"&lt;/span&gt;
                       &lt;span class="na"&gt;AutoExpandGroups=&lt;/span&gt;&lt;span class="s"&gt;"True"&lt;/span&gt;
                       &lt;span class="na"&gt;ColumnSizer=&lt;/span&gt;&lt;span class="s"&gt;"SizeToHeader"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;behaviors:Interaction.Behaviors&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;local:DataGridBehavior/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/behaviors:Interaction.Behaviors&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/syncfusion:SfDataGrid&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What’s happening here?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ItemsSource&lt;/strong&gt; binds your student data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Columns&lt;/strong&gt; ensure your custom column definitions are applied&lt;/li&gt;
&lt;li&gt;Sorting and grouping options are enabled out of the box&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With just a few properties, the grid becomes highly interactive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Add data operations
&lt;/h2&gt;

&lt;p&gt;A grading system isn’t complete without methods for analyzing and manipulating data. Let’s add support for filtering, sorting, grouping, and column visibility.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GradeSheetViewModel&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;INotifyPropertyChanged&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Commands for opening a pop-up to handle columns and data manipulation.&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;ICommand&lt;/span&gt; &lt;span class="n"&gt;HideColumns&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;ICommand&lt;/span&gt; &lt;span class="n"&gt;HideAllColumns&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;ICommand&lt;/span&gt; &lt;span class="n"&gt;ShowAllColumns&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;ICommand&lt;/span&gt; &lt;span class="n"&gt;FilterColumns&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;ICommand&lt;/span&gt; &lt;span class="n"&gt;ClearFilter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;ICommand&lt;/span&gt; &lt;span class="n"&gt;GroupColumns&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;ICommand&lt;/span&gt; &lt;span class="n"&gt;ClearGroup&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;ICommand&lt;/span&gt; &lt;span class="n"&gt;SortColumns&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;ICommand&lt;/span&gt; &lt;span class="n"&gt;ClearSort&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;InitializeCommands&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;HideColumns&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;RelayCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;ExecuteHideColumns&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;ShowAllColumns&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;RelayCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;ExecuteShowAllColumns&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;HideAllColumns&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;RelayCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;ExecuteHideAllColumns&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;FilterColumns&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;RelayCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;ExecuteFilterColumns&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;ClearFilter&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;RelayCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;ExecuteClearFilter&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;GroupColumns&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;RelayCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;ExecuteGroupColumns&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;ClearGroup&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;RelayCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;ExecuteClearGroups&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;SortColumns&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;RelayCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;ExecuteSortColumns&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;ClearSort&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;RelayCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;ExecuteClearSorts&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above code example,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;&lt;code&gt;HideColumns&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;ShowAllColumns&lt;/code&gt;&lt;/strong&gt;, and &lt;strong&gt;&lt;code&gt;HideAllColumns&lt;/code&gt;&lt;/strong&gt; commands manage column visibility in the DataGrid.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;HideColumns&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;ShowAllColumns&lt;/code&gt;&lt;/strong&gt; are linked to UI buttons or actions, toggling visibility.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;&lt;code&gt;ExecuteHideAllColumns&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;ExecuteShowAllColumns&lt;/code&gt;&lt;/strong&gt; methods iterate through the column collection to set the &lt;a href="https://help.syncfusion.com/cr/wpf/Syncfusion.UI.Xaml.Grid.GridColumnBase.html#Syncfusion_UI_Xaml_Grid_GridColumnBase_IsHidden" rel="noopener noreferrer"&gt;IsHidden&lt;/a&gt; property.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Column visibility
&lt;/h3&gt;

&lt;p&gt;You can easily toggle columns using the code example:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ExecuteHideColumns&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;IsOpenForHideColumns&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;// which will open the show/hide all columns popup.&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ExecuteHideAllColumns&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsHidden&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ExecuteShowAllColumns&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsHidden&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FShowHide-column-in-WPF-DataGrid.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FShowHide-column-in-WPF-DataGrid.gif" alt="Show/Hide column in WPF DataGrid" width="760" height="401"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Show/Hide column in WPF DataGrid
  &lt;p&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Sorting
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;&lt;code&gt;SortColumns&lt;/code&gt;&lt;/strong&gt; command manages the DataGrid’s sorting behavior through its associated &lt;strong&gt;&lt;code&gt;ExecuteAddSorting&lt;/code&gt;&lt;/strong&gt; method, which performs two key operations.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clears all existing sort descriptions&lt;/li&gt;
&lt;li&gt;Applies new sorting based on user input.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://help.syncfusion.com/cr/wpf/Syncfusion.UI.Xaml.Grid.SortColumnDescriptions.html" rel="noopener noreferrer"&gt;SortColumnDescriptions&lt;/a&gt; collection property will be used from the ViewModel to handle this operation, as shown in the code example below:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ExecuteAddSorting&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SelectedSortColumn&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;SortColumnDescriptions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;sortColumnDescription&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SortColumnDescription&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;ColumnName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SelectedSortColumn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;SortDirection&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;IsOnState&lt;/span&gt;
                &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;ListSortDirection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ascending&lt;/span&gt;
                &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ListSortDirection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Descending&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;

        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;tempCollection&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SortColumnDescriptions&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;tempCollection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sortColumnDescription&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;SortColumnDescriptions&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tempCollection&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FSorting-in-WPF-DataGrid.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F07%2FSorting-in-WPF-DataGrid.gif" alt="Sorting in WPF DataGrid" width="760" height="403"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Sorting in WPF DataGrid
  &lt;p&gt;&lt;/p&gt;

&lt;p&gt;Read the full blog post on the &lt;a href="https://www.syncfusion.com/blogs/post/custom-filtering-sorting-grouping-wpf-datagrid" rel="noopener noreferrer"&gt;Syncfusion Website&lt;/a&gt;&lt;/p&gt;

</description>
      <category>wpf</category>
      <category>netuidevelopment</category>
      <category>desktopapplications</category>
      <category>mvvmarchitecture</category>
    </item>
    <item>
      <title>Reduce XAML Boilerplate with .NET MAUI Global/Implicit Namespace + Source Generator</title>
      <dc:creator>Lucy Muturi</dc:creator>
      <pubDate>Thu, 25 Jun 2026 11:25:55 +0000</pubDate>
      <link>https://dev.to/syncfusion/reduce-xaml-boilerplate-with-net-maui-globalimplicit-namespace-source-generator-4f9o</link>
      <guid>https://dev.to/syncfusion/reduce-xaml-boilerplate-with-net-maui-globalimplicit-namespace-source-generator-4f9o</guid>
      <description>&lt;p&gt;&lt;strong&gt;TLDR:&lt;/strong&gt; What if your XAML didn’t need all that boilerplate? Use .NET MAUI global/implicit namespaces and source generator to reduce XAML boilerplate code and simplify your UI layer. By defining namespaces once in &lt;strong&gt;GlobalXmlns.cs&lt;/strong&gt; and letting the XAML source generator compile your UI into C# at build time, you eliminate repeated xmlns: clutter, catch errors earlier, and get a faster, more predictable debug and startup experience, especially when working on complex or frequently updated screens.&lt;/p&gt;

&lt;p&gt;You open a simple page to add one control, and suddenly you’re staring at a wall of &lt;strong&gt;xmlns&lt;/strong&gt; declarations as shown below.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;XAML&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:controls="clr-namespace:MyApp.Controls"
xmlns:viewModels="clr-namespace:MyApp.ViewModels"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It’s one of those things we’ve all gotten used to, but never really liked. It works, but it’s repetitive, noisy, and easy to mess up when you’re moving fast.&lt;/p&gt;

&lt;p&gt;There are two user-friendly features in .NET MAUI that quietly reduce the XAML boilerplate code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Global + implicit XML namespaces&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Source generator&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They may seem like small changes, but they significantly improve the experience of working in XAML.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why does this actually matter while building UI
&lt;/h2&gt;

&lt;p&gt;Before diving into these details, here’s what matters from a developer’s perspective:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Less boilerplate in every XAML file.&lt;/li&gt;
&lt;li&gt;Fewer runtime surprises (More compile-time feedback).&lt;/li&gt;
&lt;li&gt;Faster startup and navigation.&lt;/li&gt;
&lt;li&gt;Easier debugging (You can actually see what XAML becomes).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s not just cleaner code; it’s less friction while building UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Global/implicit XML namespaces: Keep your XAML focused on UI, not setup
&lt;/h2&gt;

&lt;p&gt;Let’s start by simplifying how XAML namespace declarations are handled in .NET MAUI.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Stop repeating xmlns everywhere, declare them globally
&lt;/h3&gt;

&lt;p&gt;Instead of declaring namespaces in every XAML file, you can define them globally in .NET MAUI using assembly attributes.&lt;/p&gt;

&lt;p&gt;You map them to the global MAUI URI: &lt;strong&gt;&lt;a href="http://schemas.microsoft.com/dotnet/maui/global" rel="noopener noreferrer"&gt;http://schemas.microsoft.com/dotnet/maui/global&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;assembly&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;XmlnsDefinition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"http://schemas.microsoft.com/dotnet/maui/global"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"MyApp.Controls"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;assembly&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;XmlnsDefinition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"http://schemas.microsoft.com/dotnet/maui/global"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"MyApp.Views"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Most teams will place this in a file named &lt;strong&gt;GlobalXmlns.cs&lt;/strong&gt;. Once that’s in place, those namespaces are automatically available across your entire app.&lt;/p&gt;

&lt;p&gt;No need for:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;XAML&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;xmlns:controls="clr-namespace:MyApp.Controls"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;… on every single page. You can define your namespaces once and forget about them.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Go one step further with implicit namespaces
&lt;/h3&gt;

&lt;p&gt;Global mappings are helpful. But implicit namespaces are where things really get interesting.&lt;/p&gt;

&lt;p&gt;You can tell MAUI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“ &lt;strong&gt;Assume this global namespace by default.”&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We can enable implicit namespaces in the &lt;strong&gt;.csproj&lt;/strong&gt; file as follows:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;XAML&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;DefineConstants&amp;gt;&lt;/span&gt;$(DefineConstants);MauiAllowImplicitXmlnsDeclaration&lt;span class="nt"&gt;&amp;lt;/DefineConstants&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;EnablePreviewFeatures&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/EnablePreviewFeatures&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, your XAML becomes dramatically simpler.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before (Typical XAML clutter)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;XAML&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ContentPage&lt;/span&gt;
   &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://schemas.microsoft.com/dotnet/2021/maui"&lt;/span&gt;
   &lt;span class="na"&gt;xmlns:x=&lt;/span&gt;&lt;span class="s"&gt;"http://schemas.microsoft.com/winfx/2009/xaml"&lt;/span&gt;
   &lt;span class="na"&gt;xmlns:controls=&lt;/span&gt;&lt;span class="s"&gt;"clr-namespace:MyApp.Controls"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

 &lt;span class="nt"&gt;&amp;lt;controls:BigControl&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ContentPage&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After (Clean Xaml code)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;XAML&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ContentPage&lt;/span&gt; &lt;span class="na"&gt;x:Class=&lt;/span&gt;&lt;span class="s"&gt;"MyApp.MainPage"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;BigControl&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ContentPage&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it. No prefixes. No repeated namespace declarations. Just the UI.&lt;/p&gt;

&lt;p&gt;The only thing that sticks around is &lt;strong&gt;xmlns:x&lt;/strong&gt;, which is still required for core XAML features.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real-world scenario: Managing XAML at scale in .NET MAUI
&lt;/h3&gt;

&lt;p&gt;If you’ve worked on a mid-to-large .NET MAUI app, you’ve likely seen this pattern:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shared UI libraries,&lt;/li&gt;
&lt;li&gt;Internal control packages, and&lt;/li&gt;
&lt;li&gt;Multiple teams touching UI layers.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every team ends up adding slightly different namespace mappings. Over time, XAML becomes inconsistent and harder to read.&lt;/p&gt;

&lt;p&gt;With global + implicit namespaces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Everyone uses the same “global language” in XAML.&lt;/li&gt;
&lt;li&gt;Refactoring namespaces becomes centralized.&lt;/li&gt;
&lt;li&gt;New developers ramp up faster (Less ceremony to understand).
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s especially useful in enterprise setups where UI code gets reused across multiple apps.&lt;/p&gt;

&lt;p&gt;Read the full blog post on the &lt;a href="https://www.syncfusion.com/blogs/post/reduce-xaml-boilerplate-code-in-maui" rel="noopener noreferrer"&gt;Syncfusion Website&lt;/a&gt;&lt;/p&gt;

</description>
      <category>netmaui</category>
      <category>crossplatform</category>
      <category>desktop</category>
      <category>maui</category>
    </item>
    <item>
      <title>Better Auth: Framework-Agnostic Authentication Solution for TypeScript Apps</title>
      <dc:creator>Lucy Muturi</dc:creator>
      <pubDate>Wed, 24 Jun 2026 11:44:58 +0000</pubDate>
      <link>https://dev.to/syncfusion/better-auth-framework-agnostic-authentication-solution-for-typescript-apps-3kh</link>
      <guid>https://dev.to/syncfusion/better-auth-framework-agnostic-authentication-solution-for-typescript-apps-3kh</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Designing authentication that survives framework changes is hard. This article explains how Better Auth enables framework-agnostic authentication for TypeScript apps, covering its architecture, performance, trade-offs, and real-world use cases, including Next.js, Remix, and SvelteKit. You’ll see how a self-hosted auth stack with small bundles, fast session validation, and full data ownership can improve maintainability, scalability, and long-term flexibility without framework lock-in.&lt;/p&gt;

&lt;p&gt;Modern web teams rarely sit still. A product might start with Next.js, later experiment with Remix, or grow an Express API alongside the frontend. Frameworks change, architectures evolve, but authentication tends to stick around long after the original decisions were made.&lt;/p&gt;

&lt;p&gt;That’s where things usually get painful.&lt;/p&gt;

&lt;p&gt;Authentication is often tightly coupled to a framework or outsourced to a managed service, which can become expensive and inflexible over time. Migrating frameworks means rewriting the auth logic. Scaling users means scaling costs. And gaining deeper control usually means more work than teams expect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better Auth&lt;/strong&gt; approaches this problem differently.&lt;br&gt;
Instead of treating authentication as a framework feature, it treats it as infrastructure you own &lt;strong&gt;:&lt;/strong&gt; portable, TypeScript-first, and designed to survive framework changes.&lt;/p&gt;

&lt;p&gt;In this article, we’ll look at how Better Auth works, where it fits well, and when it might not be the right choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why framework-agnostic authentication matters
&lt;/h2&gt;

&lt;p&gt;At the start of a project, most authentication solutions feel fine. They’re easy to set up, tightly integrated, and well-documented. The trade-offs only surface later.&lt;/p&gt;

&lt;p&gt;Teams usually run into trouble when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A frontend framework migration is needed&lt;/li&gt;
&lt;li&gt;Multiple frameworks coexist in the same system&lt;/li&gt;
&lt;li&gt;User growth triggers unexpected pricing models&lt;/li&gt;
&lt;li&gt;Deeper control over sessions or data becomes necessary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In these situations, authentication becomes an anchor. The tighter it’s bound to one framework or vendor, the harder it is to move.&lt;/p&gt;

&lt;p&gt;Better Auth is built for teams that expect change and want authentication to be &lt;strong&gt;portable by design&lt;/strong&gt;, not something that must be rewritten every time the stack evolves.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Better Auth works (Core concepts and architecture)
&lt;/h2&gt;

&lt;p&gt;Better Auth is a &lt;strong&gt;TypeScript‑first authentication library&lt;/strong&gt; designed around HTTP and databases, not frameworks.&lt;/p&gt;

&lt;p&gt;At its core, it connects three layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Database layer:&lt;/strong&gt; Stores users, sessions, credentials, and verification data in your own database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication core:&lt;/strong&gt; Handles password hashing, session creation, validation, and security logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Framework adapters:&lt;/strong&gt; Translate framework requests into auth operations without embedding framework logic into the auth layer.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The result&lt;/strong&gt;: One authentication configuration that works across Next.js, Remix, SvelteKit, and Express. Frameworks pass requests through; Better Auth handles the rest.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What you gain by owning the auth layer&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This architectural shift comes with some clear benefits.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Framework portability:&lt;/strong&gt; Authentication is no longer tied to a single framework’s lifecycle. You can migrate or experiment without rewriting the auth from scratch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type safety end-to-end:&lt;/strong&gt; Because schemas generate TypeScript types, your authentication logic stays consistent across the stack.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full data ownership:&lt;/strong&gt; Users, sessions, and credentials live in your database, not inside a third-party system. That gives you control over behavior, retention, and performance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Predictable costs:&lt;/strong&gt; There’s no per-user pricing. Costs scale with infrastructure, not with user count.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For teams that have felt boxed in by framework-specific auth or rising managed-service costs, this alone can be compelling.&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance and trade‑offs
&lt;/h3&gt;

&lt;p&gt;Better Auth is designed to be lightweight and fast, but it’s also transparent about what you’re taking on.&lt;/p&gt;

&lt;p&gt;In typical setups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The auth bundle is relatively small, often in the &lt;strong&gt;&lt;code&gt;~10-15 kB gzipped&lt;/code&gt;&lt;/strong&gt; range, depending on configuration&lt;/li&gt;
&lt;li&gt;Session validation can often complete in tens of milliseconds with proper indexing and low-latency database access Sessions are database-backed, keeping memory usage predictable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That said, owning authentication also means owning its responsibilities.&lt;/p&gt;

&lt;p&gt;You’re responsible for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database migrations and cleanup&lt;/li&gt;
&lt;li&gt;Monitoring session tables&lt;/li&gt;
&lt;li&gt;Email delivery and rate limiting&lt;/li&gt;
&lt;li&gt;Security hardening beyond the defaults&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Better Auth favors &lt;strong&gt;control over convenience&lt;/strong&gt;. For teams comfortable with backend infrastructure, that’s a reasonable trade. For teams looking for zero-maintenance auth, it may not be.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Performance metrics are estimates and vary based on infrastructure, database location, connection quality, and load. Always benchmark in your specific environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a minimal Better Auth setup looks like
&lt;/h2&gt;

&lt;p&gt;To understand how Better Auth works in practice, it helps to look at a minimal setup. Instead of walking through commands or file-by-file instructions, let’s break this into the core layers and how they interact.&lt;/p&gt;

&lt;p&gt;At a high level, the setup has three parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A data layer that stores users and sessions&lt;/li&gt;
&lt;li&gt;An authentication layer that handles login and session logic&lt;/li&gt;
&lt;li&gt;A thin UI layer that interacts with the auth system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key difference is that these layers remain independent of the framework.&lt;/p&gt;

&lt;h3&gt;
  
  
  The stack (and why it stays minimal)
&lt;/h3&gt;

&lt;p&gt;This example uses Next.js, SQLite, and Drizzle ORM, not because Better Auth requires them, but because they keep the setup lightweight and easy to reason about.&lt;/p&gt;

&lt;p&gt;Better Auth itself is framework-agnostic. The framework simply acts as a transport layer for requests, while authentication logic lives independently.&lt;/p&gt;

&lt;h3&gt;
  
  
  The data layer: owning your auth data
&lt;/h3&gt;

&lt;p&gt;Let’s start with the foundation: the data layer. This is where Better Auth changes the usual approach.&lt;/p&gt;

&lt;p&gt;Instead of storing authentication data inside a managed service or hiding it behind a framework, everything lives directly in your database.&lt;/p&gt;

&lt;p&gt;In practice, this typically translates into a small set of core tables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;user:&lt;/strong&gt; stores profile information&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;session:&lt;/strong&gt; tracks active sessions and expiration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;account:&lt;/strong&gt; manages credentials or provider accounts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;verification:&lt;/strong&gt; handles temporary tokens like email verification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The exact structure can vary, but the important shift is ownership. Authentication data is no longer abstracted away. It becomes part of your application’s data model.&lt;/p&gt;

&lt;p&gt;This also means it evolves with your product. Schema changes, indexing, and performance tuning become part of your responsibility, not something delegated to a third-party system.&lt;/p&gt;

&lt;h3&gt;
  
  
  The authentication layer: where everything connects
&lt;/h3&gt;

&lt;p&gt;Once the data layer is in place, the next piece is the authentication layer, where everything comes together.&lt;/p&gt;

&lt;p&gt;This is where Better Auth becomes the center of the system. Instead of spreading authentication logic across routes, controllers, or framework-specific APIs, everything is defined in one place.&lt;/p&gt;

&lt;p&gt;The database connects through an adapter, and authentication methods such as email and password are enabled declaratively. From that point on, the same logic handles every request, regardless of where it originates.&lt;/p&gt;

&lt;p&gt;That consistency is what makes the approach powerful. Whether a request comes from Next.js, Remix, or an Express API, it flows through the same authentication layer. This separation is what enables true framework portability.&lt;/p&gt;

&lt;p&gt;Read the full blog post on the &lt;a href="https://www.syncfusion.com/blogs/post/better-auth-framework-agnostic-authentication" rel="noopener noreferrer"&gt;Syncfusion Website&lt;/a&gt;&lt;/p&gt;

</description>
      <category>betterauth</category>
      <category>authenticationandaut</category>
      <category>backendservices</category>
      <category>frameworkagnosticlib</category>
    </item>
    <item>
      <title>Real-Time Angular Gantt Chart with SignalR: Multi-User Project Sync Without Refresh</title>
      <dc:creator>Lucy Muturi</dc:creator>
      <pubDate>Tue, 23 Jun 2026 11:20:28 +0000</pubDate>
      <link>https://dev.to/syncfusion/real-time-angular-gantt-chart-with-signalr-multi-user-project-sync-without-refresh-29nh</link>
      <guid>https://dev.to/syncfusion/real-time-angular-gantt-chart-with-signalr-multi-user-project-sync-without-refresh-29nh</guid>
      <description>&lt;p&gt;&lt;strong&gt;TLDR:&lt;/strong&gt; Concurrency issues don’t break your Gantt chart UI; they break trust in the data. The moment multiple users start editing, timelines drift, updates get missed, and teams fall back to manual coordination. This approach changes that. By integrating SignalR into your Angular Gantt Chart, wiring a lightweight backend hub, real-time client listeners, and event-driven updates, you turn a static timeline into a live, shared system. No polling, no refreshes, no guesswork; just instant updates and a consistent view for every user, exactly when it matters.&lt;/p&gt;

&lt;p&gt;In most project management tools, things start breaking the moment multiple users start editing at the same time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One person updates a task.&lt;/li&gt;
&lt;li&gt;Another modifies dependency.&lt;/li&gt;
&lt;li&gt;Someone else shifts a timeline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before long, everyone looks at a slightly different version of the same data.&lt;/p&gt;

&lt;p&gt;A Gantt Chart helps organize all of this; it visualizes dependencies, timelines, and resources clearly. But by default, it’s still just a local snapshot. Once multiple users are involved, keeping everyone in sync becomes the real problem.&lt;/p&gt;

&lt;p&gt;This is where real-time updates change the behavior completely.&lt;/p&gt;

&lt;p&gt;Instead of relying on refreshes or polling, &lt;a href="https://dotnet.microsoft.com/en-us/apps/aspnet/signalr" rel="noopener noreferrer"&gt;SignalR&lt;/a&gt; keeps a persistent connection and pushes updates instantly to all connected clients.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The result is simple&lt;/strong&gt;: everyone sees the same timeline, in real time, without second-guessing whether their view is up to date.&lt;/p&gt;

&lt;p&gt;In this guide, we’ll walk you through integrating SignalR into the Syncfusion&lt;sup&gt;®&lt;/sup&gt; &lt;a href="https://www.syncfusion.com/angular-components/angular-gantt-chart" rel="noopener noreferrer"&gt;Angular Gantt Chart&lt;/a&gt; setup to make that happen.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you gain: a timeline that stays in sync automatically
&lt;/h2&gt;

&lt;p&gt;Once real-time updates are in place, the Gantt Chart behaves more like a shared system than a static UI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Immediate updates&lt;/strong&gt;: Changes made by one user appear for everyone instantly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No refresh cycles&lt;/strong&gt;: The UI stays current without manual intervention.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event-driven behavior&lt;/strong&gt;: Updates are pushed only when something changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Less coordination overhead&lt;/strong&gt;: Everyone stays aligned without follow-ups.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where this approach actually matters
&lt;/h2&gt;

&lt;p&gt;Integrating SignalR with the Angular Gantt Chart is most useful when multiple roles interact with the same timeline.&lt;/p&gt;

&lt;p&gt;For example, in a sprint planning tool:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A product owner adjusts deadlines.&lt;/li&gt;
&lt;li&gt;Developers update tasks and dependencies.&lt;/li&gt;
&lt;li&gt;QA engineer modifies testing windows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without real-time sync, updates get missed or overwritten, and teams fall back to messaging each other for confirmation.&lt;/p&gt;

&lt;p&gt;With SignalR in place, the Gantt Chart behaves like a shared workspace; updates are visible immediately, and everyone works off the same state.&lt;/p&gt;

&lt;p&gt;You’ll see similar benefits in tools like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Construction scheduling,&lt;/li&gt;
&lt;li&gt;Resource planning dashboards, or&lt;/li&gt;
&lt;li&gt;Internal workflow trackers,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;….. and anywhere multiple users actively edit the timeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you need to get started
&lt;/h2&gt;

&lt;p&gt;The setup is fairly lightweight:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visual Studio or VS Code&lt;/li&gt;
&lt;li&gt;Angular application&lt;/li&gt;
&lt;li&gt;.NET 8+ backend&lt;/li&gt;
&lt;li&gt;SignalR&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nodejs.org/en" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; and Angular CLI (ng new gantt-signalr)&lt;/li&gt;
&lt;li&gt;A valid Syncfusion license key&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setting up the backend: .NET Core with SignalR
&lt;/h2&gt;

&lt;p&gt;Before jumping onto the Angular side, it’s worth getting the backend ready. This is where the real-time behavior actually lives. Instead of thinking of it as just another API, think of it more like an event relay that pushes updates whenever something changes.&lt;/p&gt;

&lt;p&gt;If you’ve tried solving multi-user sync with polling before, you already know how quickly it becomes inefficient. SignalR avoids that entirely by maintaining a connection and pushing updates only when needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  #1: Getting a basic API in place
&lt;/h3&gt;

&lt;p&gt;Start with a standard &lt;a href="https://ej2.syncfusion.com/aspnetcore/documentation/gantt/getting-started" rel="noopener noreferrer"&gt;ASP.NET Core Web API project&lt;/a&gt;. Nothing unusual here.&lt;/p&gt;

&lt;p&gt;If you already have a backend serving your Gantt data, you’re in a good place; you don’t need to rebuild anything. Just add SignalR on top of what you already have.&lt;/p&gt;

&lt;h3&gt;
  
  
  #2: Adding the SignalR hub (your real-time bridge)
&lt;/h3&gt;

&lt;p&gt;Once the project is ready, the next step is adding a hub.&lt;/p&gt;

&lt;p&gt;Create a folder called &lt;strong&gt;Hubs&lt;/strong&gt;, and inside that add a file named &lt;strong&gt;ChatHub.cs&lt;/strong&gt;. This hub defines the &lt;strong&gt;SendMessage&lt;/strong&gt; method that broadcasts messages to all connected clients.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;//Hubs/ChatHub.cs&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.AspNetCore.SignalR&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;GanttSignalRBackend.Hubs&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ChatHub&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Hub&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;SendMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Clients&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;All&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SendAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ReceiveMessage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this point, you’re not doing anything complex; you’re just broadcasting a message to every connected client. That’s enough to build your sync loop.&lt;/p&gt;

&lt;h3&gt;
  
  
  #3: Wiring it up so Angular can talk to it
&lt;/h3&gt;

&lt;p&gt;With the hub in place, the next step is to register SignalR services and enable CORS (Cross-Origin Resource Sharing) and make sure your frontend can actually connect to it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Program.cs&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;signalR.Hubs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddSignalR&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Add SignalR services&lt;/span&gt;

&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddCors&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddDefaultPolicy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;policy&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WithOrigins&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://localhost:7297"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Angular dev server&lt;/span&gt;
              &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AllowAnyHeader&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
              &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AllowAnyMethod&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
              &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AllowCredentials&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CORS setup is important during development, since our Angular app typically runs on a different port. Without it, the connection won’t go through.&lt;/p&gt;

&lt;h3&gt;
  
  
  #4: Run the project
&lt;/h3&gt;

&lt;p&gt;At this point, you can just start the backend using the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It should start on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;https://localhost:7297&lt;span class="o"&gt;(&lt;/span&gt;or a similar port&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, the backend is ready! It can accept connections and push updates to any client that’s listening.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up the frontend: Angular with Syncfusion Gantt Chart
&lt;/h2&gt;

&lt;p&gt;With the backend ready to push updates, the front-end is where things start to feel different.&lt;/p&gt;

&lt;p&gt;Up until now, your Gantt chart has probably behaved like a snapshot; render data once, and that’s it. Now, you’re going to make it react to changes happening elsewhere.&lt;/p&gt;

&lt;p&gt;You don’t need a complex setup to get there. A regular Angular app with a working Gantt chart is enough.&lt;/p&gt;

&lt;h3&gt;
  
  
  #1: Start with your usual Angular setup
&lt;/h3&gt;

&lt;p&gt;Create your &lt;a href="https://ej2.syncfusion.com/angular/documentation/gantt/getting-started" rel="noopener noreferrer"&gt;Angular project and set up the Gantt Chart&lt;/a&gt; however you normally would. Nothing has changed here yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  #2: Add the SignalR client package
&lt;/h3&gt;

&lt;p&gt;To handle real-time updates, we need the SignalR client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @microsoft/signalr –save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once that’s installed, Angular is ready to connect to the backend and start listening for updates.&lt;/p&gt;

&lt;h3&gt;
  
  
  #3: Register the Syncfusion license key
&lt;/h3&gt;

&lt;p&gt;Before moving further, make sure your license key is registered in your component:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;app.component.ts&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;registerLicense&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@syncfusion/ej2-base&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nf"&gt;registerLicense&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_SYNC FUSION_LICENSE_KEY&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that, your Gantt Chart setup remains exactly as usual.&lt;/p&gt;

&lt;p&gt;Read the full blog post on the &lt;a href="https://www.syncfusion.com/blogs/post/add-angular-gantt-chart-with-signalr" rel="noopener noreferrer"&gt;Syncfusion Website&lt;/a&gt;&lt;/p&gt;

</description>
      <category>angular</category>
      <category>development</category>
      <category>ganttchart</category>
      <category>realtimecollaboration</category>
    </item>
    <item>
      <title>How to Scale React Pivot Tables with Docker and Server-Side Processing</title>
      <dc:creator>Lucy Muturi</dc:creator>
      <pubDate>Mon, 22 Jun 2026 12:20:31 +0000</pubDate>
      <link>https://dev.to/syncfusion/how-to-scale-react-pivot-tables-with-docker-and-server-side-processing-1fo7</link>
      <guid>https://dev.to/syncfusion/how-to-scale-react-pivot-tables-with-docker-and-server-side-processing-1fo7</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Large datasets can quickly slow down applications when the browser handles heavy data operations. In this guide, you’ll learn how to implement React Pivot Table server-side processing using Docker, move expensive filtering and aggregation to the backend, and build faster, scalable React applications with better performance.&lt;/p&gt;

&lt;p&gt;When you start working with large datasets in a Pivot Table, things can slow down quickly. What works fine with a few thousand rows can become frustrating with hundreds of thousands.&lt;/p&gt;

&lt;p&gt;The main problem?&lt;br&gt;
Too much processing is happening in the browser.&lt;/p&gt;

&lt;p&gt;That’s where a &lt;strong&gt;server-side pivot engine&lt;/strong&gt; comes in; it shifts heavy operations like aggregation, filtering, and sorting to the backend.&lt;/p&gt;

&lt;p&gt;In this guide, we’ll walk through how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up a Syncfusion&lt;sup&gt;®&lt;/sup&gt; &lt;a href="https://www.syncfusion.com/react-components/react-pivot-table" rel="noopener noreferrer"&gt;React Pivot Table&lt;/a&gt; server-side pivot engine&lt;/li&gt;
&lt;li&gt;Containerize it using Docker&lt;/li&gt;
&lt;li&gt;Connect it to a React application&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the end, you’ll have a setup that’s &lt;strong&gt;portable, scalable, and much easier to maintain&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why would you actually need this?
&lt;/h2&gt;

&lt;p&gt;Before diving into setup, let’s make this real.&lt;/p&gt;

&lt;p&gt;You’ll need a server-side Pivot Table when building things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A sales dashboard with hundreds of thousands of records&lt;/li&gt;
&lt;li&gt;A finance reporting tool with complex aggregations&lt;/li&gt;
&lt;li&gt;A business intelligence UI where users slice and dice large datasets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In scenarios like these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Browser memory gets stressed&lt;/li&gt;
&lt;li&gt;UI becomes sluggish&lt;/li&gt;
&lt;li&gt;Data processing becomes unreliable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Moving that workload to the server solves all of that cleanly.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Docker makes this easier
&lt;/h2&gt;

&lt;p&gt;Setting up a backend service manually can be messy, with different machines, missing dependencies, and version mismatches.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.docker.com/" rel="noopener noreferrer"&gt;Docker&lt;/a&gt; simplifies this by packaging everything your app needs into a container.&lt;/p&gt;

&lt;p&gt;Think of it like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.docker.com/get-started/docker-concepts/the-basics/what-is-an-image/" rel="noopener noreferrer"&gt;Docker Image&lt;/a&gt; → blueprint&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container&lt;/strong&gt; → running instance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once your app is containerized:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It behaves the same everywhere&lt;/li&gt;
&lt;li&gt;You avoid “works on my machine” issues&lt;/li&gt;
&lt;li&gt;Deployment becomes predictable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To explore Docker further and start using it on your system, visit the official Docker &lt;a href="https://docs.docker.com/get-started/" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before getting started, make sure you have the following installed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visual Studio 2022 with ASP.NET workload&lt;/li&gt;
&lt;li&gt;Docker Desktop (installed and running)

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/desktop/setup/install/windows-install/" rel="noopener noreferrer"&gt;Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/desktop/setup/install/linux/" rel="noopener noreferrer"&gt;Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/desktop/setup/install/mac-install/" rel="noopener noreferrer"&gt;Mac&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nodejs.org/" rel="noopener noreferrer"&gt;Node.js LTS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Phase 1: Get the server-side engine ready
&lt;/h2&gt;

&lt;p&gt;Let’s start with the backend.&lt;/p&gt;

&lt;p&gt;Instead of building everything from scratch, you can use a ready-made ASP.NET Core &lt;a href="https://github.com/SyncfusionExamples/server-side-pivot-engine-for-pivot-table" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; sample that already includes the pivot engine.&lt;/p&gt;

&lt;p&gt;Once you download it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open the project in Visual Studio&lt;/li&gt;
&lt;li&gt;Build it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s it, the required dependencies will be restored automatically.&lt;/p&gt;

&lt;p&gt;At this point, you already have a backend capable of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Processing pivot data&lt;/li&gt;
&lt;li&gt;Handling API requests&lt;/li&gt;
&lt;li&gt;Working with large datasets efficiently&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For more details about the server-side Pivot Engine and how it works, you can refer to our  React Pivot Table official &lt;a href="https://ej2.syncfusion.com/react/documentation/pivotview/server-side-pivot-engine" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Phase 2: Containerize the backend using Docker
&lt;/h2&gt;

&lt;p&gt;Now let’s package this backend so it can run anywhere.&lt;/p&gt;
&lt;h3&gt;
  
  
  Option 1 (simplest): Use Visual Studio
&lt;/h3&gt;

&lt;p&gt;If you’re using Visual Studio, this is almost effortless:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Right-click the project&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Add → Docker Support&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;


  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F06%2FAdding-Docker-Support-in-Visual-Studio.png" alt="Adding Docker Support in Visual Studio" width="434" height="467"&gt;Adding Docker Support in Visual Studio
  


&lt;ul&gt;
&lt;li&gt;Choose Linux&lt;/li&gt;
&lt;/ul&gt;


  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F06%2FChoosing-Target-OS-for-Docker.png" alt="Choosing Target OS for Docker" width="493" height="436"&gt;Choosing Target OS for Docker
  


&lt;p&gt;Visual Studio automatically generates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Dockerfile&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;&lt;code&gt;.dockerignore&lt;/code&gt;&lt;/strong&gt; file&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don’t need to manually configure anything.&lt;/p&gt;
&lt;h3&gt;
  
  
  Option 2: Use a Dockerfile manually
&lt;/h3&gt;

&lt;p&gt;If you prefer more control, you can add a &lt;strong&gt;Dockerfile&lt;/strong&gt; yourself.&lt;/p&gt;

&lt;p&gt;Sample configuration&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dockerfile&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# This stage is used when running from VS in fast mode (Default for Debug configuration)&lt;/span&gt;

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;mcr.microsoft.com/dotnet/aspnet:9.0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;base&lt;/span&gt;
&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; $APP_UID&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 8080&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 8081&lt;/span&gt;

&lt;span class="c"&gt;# This stage is used to build the service project&lt;/span&gt;

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;mcr.microsoft.com/dotnet/sdk:9.0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;build&lt;/span&gt;
&lt;span class="k"&gt;ARG&lt;/span&gt;&lt;span class="s"&gt; BUILD_CONFIGURATION=Release&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /src&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; ["PivotController.csproj", "."]&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;dotnet restore &lt;span class="s2"&gt;"./PivotController.csproj"&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; "/src/."&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;dotnet build &lt;span class="s2"&gt;"./PivotController.csproj"&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="nv"&gt;$BUILD_CONFIGURATION&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /app/build

&lt;span class="c"&gt;# This stage is used to publish the service project to be copied to the final stage&lt;/span&gt;

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;build&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;publish&lt;/span&gt;
&lt;span class="k"&gt;ARG&lt;/span&gt;&lt;span class="s"&gt; BUILD_CONFIGURATION=Release&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;dotnet publish &lt;span class="s2"&gt;"./PivotController.csproj"&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="nv"&gt;$BUILD_CONFIGURATION&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /app/publish /p:UseAppHost&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;

&lt;span class="c"&gt;# This stage is used in production or when running from VS in regular mode (Default when not using the Debug configuration)&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;base&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;final&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=publish /app/publish .&lt;/span&gt;
&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="s"&gt; ["dotnet", "PivotController.dll"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If your application uses a different version of .NET (for example, .NET 8.0 or .NET 7.0), make sure to update the version numbers in the FROM lines accordingly.&lt;/p&gt;

&lt;p&gt;At a high level, the Dockerfile:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FROM&lt;/strong&gt;: Sets the base image (usually a .NET SDK image).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WORKDIR&lt;/strong&gt;: Defines the working directory inside the container.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;COPY&lt;/strong&gt;: Copies your project files into the container.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RUN&lt;/strong&gt;: Runs commands like dotnet build or dotnet publish.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EXPOSE&lt;/strong&gt;: Tells Docker which port the container will use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ENTRYPOINT&lt;/strong&gt;: Specifies the command to run when the container starts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even if you’ve never worked with Dockerfiles before, you don’t need to memorize every instruction; the structure is consistent across most .NET apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build the Docker image
&lt;/h2&gt;

&lt;p&gt;Once the Dockerfile is ready, build the image.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 1: Using Visual Studio
&lt;/h3&gt;

&lt;p&gt;Just right-click the Dockerfile and build; it handles everything.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F06%2FBuilding-Docker-Image-in-Visual-Studio.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2026%2F06%2FBuilding-Docker-Image-in-Visual-Studio.png" alt="Building a Docker Image in Visual Studio" width="331" height="413"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Building a Docker Image in Visual Studio
  &lt;p&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 2: Using terminal
&lt;/h3&gt;

&lt;p&gt;Run:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docker CLI&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; pivotcontroller &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That single command creates your container image.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Make sure to include the dot (.) at the end; it tells &lt;a href="https://www.docker.com/" rel="noopener noreferrer"&gt;Docker&lt;/a&gt; to use the current directory.&lt;/p&gt;

&lt;p&gt;Read the full blog post on the &lt;a href="https://www.syncfusion.com/blogs/post/react-pivot-table-server-side-docker" rel="noopener noreferrer"&gt;Syncfusion Website&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>datavisualization</category>
      <category>docker</category>
      <category>pivottable</category>
    </item>
  </channel>
</rss>
