<?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: Gayathri-github7</title>
    <description>The latest articles on DEV Community by Gayathri-github7 (@gayathrigithub7).</description>
    <link>https://dev.to/gayathrigithub7</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1262708%2Ff1e9c4bb-2c52-445c-a72c-e20a15ed2645.jpeg</url>
      <title>DEV Community: Gayathri-github7</title>
      <link>https://dev.to/gayathrigithub7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gayathrigithub7"/>
    <language>en</language>
    <item>
      <title>What’s New in Next.js 15 RC?</title>
      <dc:creator>Gayathri-github7</dc:creator>
      <pubDate>Thu, 29 Aug 2024 11:53:51 +0000</pubDate>
      <link>https://dev.to/syncfusion/whats-new-in-nextjs-15-rc-430b</link>
      <guid>https://dev.to/syncfusion/whats-new-in-nextjs-15-rc-430b</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Explore Next.js 15 RC’s innovative features, including support for React 19 RC, improved hydration error handling, and advanced caching updates. The blog covers stable enhancements like the React Compiler and experimental features such as partial prerendering. Learn how to upgrade to the new version and leverage these improvements for more efficient web development.&lt;/p&gt;

&lt;p&gt;In this blog, we will explore the &lt;a href="https://nextjs.org/blog/next-15-rc" rel="noopener noreferrer"&gt;Next.js 15 RC&lt;/a&gt; to test the latest features for the upcoming stable release of &lt;a href="https://nextjs.org/" rel="noopener noreferrer"&gt;Next.js&lt;/a&gt;. The first release candidate for Next.js 15 RC was rolled out on May 23, 2024. This means we can examine all the new development, production, and caching features. The latest updates include several key features organized into stable and experimental improvements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stable improvements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Support for React 19 RC&lt;/li&gt;
&lt;li&gt;Hydration error improvements&lt;/li&gt;
&lt;li&gt;Caching improvements&lt;/li&gt;
&lt;li&gt;Updated create-next-app&lt;/li&gt;
&lt;li&gt;Bundling external packages&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Experimental features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;React compiler&lt;/li&gt;
&lt;li&gt;Partial prerendering&lt;/li&gt;
&lt;li&gt;Next/After&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is Next.js?
&lt;/h2&gt;

&lt;p&gt;Next.js is a versatile, open-source React framework developed by Vercel. It is designed to easily build fast, SEO-friendly, and user-friendly web apps. It elegantly combines server-side rendering, static site generation, and client-side rendering capabilities, making it an outstanding choice for modern web development.&lt;/p&gt;

&lt;p&gt;Its features include automatic code splitting, efficient routing, API routes, and an optimized production build, contributing to its performance and scalability. Moreover, Next.js prioritizes developer experience, offering fast refresh for a more seamless coding process. This ensures that it caters to the end user’s needs and those creating the apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I upgrade to the latest Next.js version?
&lt;/h2&gt;

&lt;p&gt;To upgrade to the latest version of &lt;strong&gt;Next.js (version 15 RC)&lt;/strong&gt;, use the following command with your preferred package manager:&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm i next@rc react@rc react-dom@rc eslint-config-next@rc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn add next@rc react@rc react-dom@rc eslint-config-next@rc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Please note that the minimum required versions for &lt;strong&gt;react&lt;/strong&gt; and &lt;strong&gt;react-dom&lt;/strong&gt; are 19. For more information on version upgrading, refer to the &lt;a href="https://nextjs.org/docs/app/building-your-application/upgrading/version-15" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let me walk through a bunch of improvements step by step.&lt;/p&gt;

&lt;h2&gt;
  
  
  React 19 RC
&lt;/h2&gt;

&lt;p&gt;Before upgrading to React 19 RC, please check the new features and updates by visiting our &lt;a href="https://www.syncfusion.com/blogs/post/whats-new-in-react-19" rel="noopener noreferrer"&gt;blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With the unveiling of React 19 RC, the Next.js App Router is being developed on the React canary channel specifically for frameworks. This allows developers to utilize and provide input on the latest React APIs ahead of the official v19 launch. Next.js 15 RC will be compatible with React 19 RC, bringing forth novel features for both client-side and server-side environments, including Actions.&lt;/p&gt;

&lt;p&gt;For more information, please refer to the &lt;a href="https://react.dev/blog/2024/04/25/react-19-upgrade-guide" rel="noopener noreferrer"&gt;React 19 upgrade guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  React Compiler
&lt;/h2&gt;

&lt;p&gt;The React Compiler is a new experimental compiler developed by the React team at Meta. It leverages its understanding of plain JavaScript semantics and the Rules of React to analyze and optimize your code. This deep understanding enables the compiler to automatically apply optimizations, reducing the need for manual &lt;strong&gt;memoization&lt;/strong&gt;  techniques like &lt;strong&gt;useMemo&lt;/strong&gt; and &lt;strong&gt;useCallback&lt;/strong&gt;. As a result, your code becomes more concise, easier to maintain, and less prone to errors.&lt;/p&gt;

&lt;p&gt;With Next.js 15, &lt;a href="https://react.dev/learn/react-compiler" rel="noopener noreferrer"&gt;React Compiler&lt;/a&gt; support has been added. However, the React Compiler can currently only be used in Next.js through a &lt;strong&gt;Babel&lt;/strong&gt; plugin.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install babel-plugin-react-compiler
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the &lt;strong&gt;experimental.reactCompiler&lt;/strong&gt; option in the &lt;strong&gt;next.config.js&lt;/strong&gt;  file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const nextConfig = { experimental: { reactCompiler: true, },}; module.exports = nextConfig;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using the experimental option ensures support for the React Compiler in the following areas: &lt;strong&gt;App Router&lt;/strong&gt;, &lt;strong&gt;Pages Router&lt;/strong&gt;, &lt;strong&gt;Webpack&lt;/strong&gt;, and &lt;strong&gt;Turbopack.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Key benefits of the React Compiler
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automatic optimization:&lt;/strong&gt; The compiler identifies opportunities to optimize your code, improving performance without manual effort.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduced boilerplate:&lt;/strong&gt; Lessens the need for manual &lt;strong&gt;memoization&lt;/strong&gt;, leading to cleaner and more concise code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improved maintainability:&lt;/strong&gt; Simplifies code, making it easier to understand and modify.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error prevention:&lt;/strong&gt; Helps avoid common performance pitfalls related to unnecessary re-renders.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The React Compiler is currently in an experimental phase, and its features and capabilities may evolve. It’s recommended that you stay updated with the latest developments and consider using it cautiously in your projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hydration error enhancements
&lt;/h2&gt;

&lt;p&gt;Next.js 15 has improved the way hydration errors are displayed. Hydration errors happen in Next.js when there is a mismatch between the HTML rendered on the server and the HTML rendered in the client during the initial load. This mismatch can be caused by text, incorrect HTML nesting, and browser-specific code. With the new improvements, when a hydration error occurs, the source code of the error is displayed, along with suggestions on how to fix the issue.&lt;/p&gt;

&lt;p&gt;For more details, refer to the official Next.js documentation on &lt;a href="https://nextjs.org/blog/next-15-rc#hydration-error-improvements" rel="noopener noreferrer"&gt;Hydration error improvements&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Caching updates
&lt;/h2&gt;

&lt;p&gt;Caching in Next.js is essential for improving performance and reducing server load. The Next.js App Router was introduced with opinionated caching defaults, designed to provide optimal performance by default with the ability to opt out when necessary.&lt;/p&gt;

&lt;p&gt;In Next.js 15, the default behavior for caching fetch requests, GET Route Handlers, and the Client Router Cache has been updated. Previously, these were cached by default, but now they are uncached by default. If you prefer the old behavior, you can still opt into caching. Note that layouts and loading states will continue to be cached and reused during navigation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Client-side navigation cache
&lt;/h3&gt;

&lt;p&gt;When navigating between pages using &lt;strong&gt;&lt;/strong&gt; or &lt;strong&gt;useRouter&lt;/strong&gt;, the client-side router no longer caches &lt;a href="https://nextjs.org/docs/app/api-reference/file-conventions/page" rel="noopener noreferrer"&gt;page&lt;/a&gt; segments. However, these segments are still reused during browser back and forward navigation, as well as for shared layouts. To enable caching for specific page segments, you can use the &lt;a href="https://nextjs.org/docs/app/api-reference/next-config-js/staleTimes" rel="noopener noreferrer"&gt;staleTimes&lt;/a&gt; configuration option.&lt;/p&gt;

&lt;h3&gt;
  
  
  fetch Requests
&lt;/h3&gt;

&lt;p&gt;In Next.js 15, fetch requests are no longer cached by default. Previously, &lt;strong&gt;force-cache&lt;/strong&gt; was the default unless a dynamic function or dynamic config option was used.&lt;/p&gt;

&lt;p&gt;Use the Web fetch API cache option to control caching.&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="nf"&gt;fetch&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://...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;force-cache&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;no-store&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;Next.js uses the &lt;a href="https://developer.mozilla.org/docs/Web/API/Fetch_API" rel="noopener noreferrer"&gt;Web fetch API&lt;/a&gt; cache option to define how a server-side fetch request interacts with the framework’s persistent HTTP cache. The &lt;strong&gt;no-store&lt;/strong&gt; option fetches a resource from a remote server on every request and does not update the cache. The &lt;strong&gt;force-cache&lt;/strong&gt; option fetches a resource from the cache if it exists, or a remote server and updates the cache.&lt;/p&gt;

&lt;p&gt;To enable caching for fetch requests, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the cache option &lt;strong&gt;force-cache&lt;/strong&gt; for a specific fetch call.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;force-static&lt;/strong&gt; for a dynamic route’s config.&lt;/li&gt;
&lt;li&gt;Set the &lt;strong&gt;fetchCache&lt;/strong&gt; route config to &lt;strong&gt;default-cache&lt;/strong&gt; to apply &lt;strong&gt;force-cache&lt;/strong&gt; globally on a page or layout, except for fetch calls with a different cache setting.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  GET route handlers
&lt;/h3&gt;

&lt;p&gt;In Next 14, Route Handlers that used the &lt;strong&gt;GET HTTP&lt;/strong&gt; method were cached by default unless they used a dynamic function or dynamic config option. In Next.js 15, &lt;strong&gt;GET&lt;/strong&gt; route handlers are no longer cached by default.&lt;/p&gt;

&lt;p&gt;To enable caching for &lt;strong&gt;GET&lt;/strong&gt; route handlers, use a static route configuration option like:&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;export&lt;/span&gt; &lt;span class="nx"&gt;dynamic&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;force-static&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Special Route Handlers such as &lt;strong&gt;sitemap.ts&lt;/strong&gt; and other metadata files are static by default unless they use dynamic functions or dynamic config options.&lt;/p&gt;

&lt;h3&gt;
  
  
  Client router cache behavior in Next.js 15
&lt;/h3&gt;

&lt;p&gt;An experimental &lt;strong&gt;staleTimes&lt;/strong&gt; flag was introduced to allow custom configuration of the Router Cache in Next.js 14.2.0. This flag still remains accessible in Next.js 15. However, we are changing the default behavior to a &lt;strong&gt;staleTime&lt;/strong&gt; of 0 for Page segments. This means that as you navigate your app, the client will always reflect the latest data from the Page component(s) that become active as part of the navigation. However, there are still important behaviors that remain unchanged:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shared layout data avoids server re-fetching, supporting partial rendering.&lt;/li&gt;
&lt;li&gt;Browser back/forward navigation restores cache, including scroll position.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loading.js&lt;/strong&gt; is cached for 5 minutes or per &lt;strong&gt;staleTimes.static&lt;/strong&gt; config.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can opt into the previous client router cache behavior by setting the following configuration:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;next.config.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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;experimental&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;staleTimes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;dynamic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&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="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Create-next-app enhancements
&lt;/h2&gt;

&lt;p&gt;Let’s discuss the improvements in  &lt;strong&gt;create-next-app&lt;/strong&gt;. When you launch the app, it now has a new landing page and provides a prompt for choosing &lt;strong&gt;Turbopack&lt;/strong&gt; when creating the Next app.&lt;/p&gt;

&lt;p&gt;The Next.js 14 release introduced an incremental bundler called &lt;strong&gt;Turbopack&lt;/strong&gt;, which is written in &lt;strong&gt;Rust&lt;/strong&gt; and designed to optimize &lt;strong&gt;JavaScript&lt;/strong&gt; and &lt;strong&gt;TypeScript.&lt;/strong&gt; It has been integrated into Next.js to improve development performance.&lt;/p&gt;

&lt;p&gt;In the Next.js 15 RC, when running the &lt;strong&gt;create-next-app&lt;/strong&gt; command, a new prompt asks whether you would like to enable &lt;strong&gt;Turbopack&lt;/strong&gt; for local development. The default setting is &lt;strong&gt;No.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; ![✔](https://s.w.org/images/core/emoji/14.0.0/72x72/2714.png) Would you like to use Turbopack for next dev? … No / Yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;–turbo flag&lt;/strong&gt; can be used to activate Turbopack.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-next-app@rc –turbo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To simplify the process of getting started on a new project, a new &lt;strong&gt;–empty&lt;/strong&gt; flag has been included in the CLI. This flag removes unnecessary files and styles, resulting in a minimal &lt;strong&gt;Hello world&lt;/strong&gt; page.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-next-app@rc –empty
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Improving the bundling of external libraries (stable)
&lt;/h2&gt;

&lt;p&gt;Integrating external libraries can enhance an app’s initial load performance. By default, the app router bundles external libraries, but you can exclude particular libraries using the &lt;a href="https://rc.nextjs.org/docs/app/api-reference/next-config-js/serverExternalPackages" rel="noopener noreferrer"&gt;serverExternalPackages&lt;/a&gt; configuration option.&lt;/p&gt;

&lt;p&gt;In the &lt;strong&gt;Pages Router&lt;/strong&gt;, external libraries are not bundled by default. However, you can specify a list of libraries you wish to bundle through the &lt;a href="https://rc.nextjs.org/docs/pages/api-reference/next-config-js/transpilePackages" rel="noopener noreferrer"&gt;transpilePackages&lt;/a&gt; option, which requires individual package specifications.&lt;/p&gt;

&lt;p&gt;To streamline configurations across both the &lt;strong&gt;App&lt;/strong&gt; and &lt;strong&gt;Pages routers,&lt;/strong&gt; a new option named &lt;a href="https://rc.nextjs.org/docs/pages/api-reference/next-config-js/bundlePagesRouterDependencies" rel="noopener noreferrer"&gt;bundlePagesRouterDependencies&lt;/a&gt; was introduced. This setting will align with the App Router’s default behavior of automatically bundling external libraries. The &lt;a href="https://rc.nextjs.org/docs/app/api-reference/next-config-js/serverExternalPackages" rel="noopener noreferrer"&gt;serverExternalPackages&lt;/a&gt; option remains available to exclude specific libraries as needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Response execution with next/after (experimental)
&lt;/h2&gt;

&lt;p&gt;When handling a user request, the server usually focuses on tasks directly related to generating the response. However, additional tasks like logging, analytics, or synchronizing with external systems often need to be performed.&lt;/p&gt;

&lt;p&gt;These secondary tasks should ensure the user’s response is timely. Deferring such tasks can be challenging because serverless functions typically stop execution as soon as the response is sent.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;after()&lt;/strong&gt; API, currently experimental, addresses this issue by allowing you to schedule tasks to run after the response has been streamed. This enables secondary tasks to execute without blocking the primary response.&lt;/p&gt;

&lt;p&gt;To enable this feature, add &lt;strong&gt;experimental.after&lt;/strong&gt; to your &lt;strong&gt;next.config.js&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;experimental&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;after&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="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, import the function in &lt;strong&gt;Server Components&lt;/strong&gt;, &lt;strong&gt;Server Actions&lt;/strong&gt;, &lt;strong&gt;Route Handlers&lt;/strong&gt;, or &lt;strong&gt;Middleware.&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;unstable_after&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;after&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;next/server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&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;Layout&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Secondary task.&lt;/span&gt;
  &lt;span class="nf"&gt;after&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="err"&gt;…&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// Primary task.&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Partial prerendering
&lt;/h2&gt;

&lt;p&gt;Partial Prerendering, or PPR, was rolled out in Next.JS 14. It is an optimization that blends static and dynamic rendering on the same page.&lt;/p&gt;

&lt;p&gt;By default, Next.js uses static rendering unless dynamic functions like &lt;strong&gt;cookies()&lt;/strong&gt;, &lt;strong&gt;headers()&lt;/strong&gt;, or uncached data requests are used, which switch the entire route to dynamic rendering. With PPR, you can wrap dynamic UI components in a &lt;strong&gt;Suspense&lt;/strong&gt; boundary. When a new request is made, Next.js immediately serves a static HTML shell and then renders and streams the dynamic parts within the same HTTP request.&lt;/p&gt;

&lt;p&gt;To facilitate incremental adoption, we’ve added an &lt;strong&gt;experimental_ppr&lt;/strong&gt; route config option to enable PPR for specific &lt;strong&gt;Layouts&lt;/strong&gt; and &lt;strong&gt;Pages.&lt;/strong&gt; Refer to the following code example.&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;Suspense&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="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&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;StaticComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;DynamicComponent&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="s2"&gt;@/app/ui&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;experimental_ppr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&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;Page&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;&amp;gt;&lt;/span&gt;
       &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;StaticComponent&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;Suspense&lt;/span&gt; &lt;span class="nx"&gt;fallback&lt;/span&gt;&lt;span class="o"&gt;=&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;DynamicComponent&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;/Suspense&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;/&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;To use this new option, set the &lt;strong&gt;experimental.ppr&lt;/strong&gt; config to &lt;strong&gt;incremental&lt;/strong&gt; in your &lt;strong&gt;next.config.js&lt;/strong&gt; file.&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;experimental&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;ppr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;incremental&lt;/span&gt;&lt;span class="dl"&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;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once all segments have PPR enabled, setting the &lt;strong&gt;ppr&lt;/strong&gt; value to &lt;strong&gt;true&lt;/strong&gt; will be safe, enabling it for the entire app and all future routes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Thanks for reading! In this article, we delved into the notable features and improvements of Next.js 15 RC, covering everything from stable advancements like React 19 RC support and enhanced caching techniques to experimental additions such as the React Compiler and partial prerendering. Next.js is pushing the envelope of web development, enhancing both the developer experience and the performance of web apps.&lt;/p&gt;

&lt;p&gt;With its emphasis on optimizing development flows and fine-tuning app performance, Next.js 15 RC reflects a clear vision for the future of web development. As we anticipate the stable release, this version offers a glimpse into a more efficient and dynamic approach to building web apps. For those looking to upgrade or kickstart new projects, Next.js 15 RC is worth exploring, promising to elevate your web development endeavors to new heights. Keep an eye on the &lt;a href="https://nextjs.org/blog/next-15-rc" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt; for the latest updates and best practices for a smooth transition.&lt;/p&gt;

&lt;p&gt;You can check practical demonstrations regarding using Syncfusion with React NextJS in our &lt;a href="https://ej2.syncfusion.com/nextjs/demos/fluent2/grid/overview" rel="noopener noreferrer"&gt;demos&lt;/a&gt;. These demonstrations are designed to guide you through the integration process, showcasing various features and capabilities to enhance your projects.&lt;/p&gt;

&lt;p&gt;Additionally, check the step-by-step guide for setting up a Next.js app and integrating the Syncfusion React components in the &lt;a href="https://ej2.syncfusion.com/react/documentation/getting-started/nextjs" rel="noopener noreferrer"&gt;UG documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Syncfusion’s &lt;a href="https://www.syncfusion.com/react-components" rel="noopener noreferrer"&gt;React&lt;/a&gt; UI components library is the only suite you will ever need to build an app. It contains over 80 high-performance, lightweight, modular, and responsive UI components in a single package.&lt;/p&gt;

&lt;p&gt;If you’re already a Syncfusion user, the latest version of Essential Studio is available on the &lt;a href="https://www.syncfusion.com/account/downloads" rel="noopener noreferrer"&gt;License and Downloads&lt;/a&gt; page. We offer our new users a &lt;a href="https://www.syncfusion.com/downloads/" rel="noopener noreferrer"&gt;30-day free trial&lt;/a&gt; to explore all our components’ features and capabilities.&lt;/p&gt;

&lt;p&gt;If you need further assistance, contact us via our &lt;a href="https://www.syncfusion.com/forums" rel="noopener noreferrer"&gt;support forum&lt;/a&gt;, &lt;a href="https://support.syncfusion.com/" rel="noopener noreferrer"&gt;support portal&lt;/a&gt;, or &lt;a href="https://www.syncfusion.com/feedback" rel="noopener noreferrer"&gt;feedback portal&lt;/a&gt;. We’re always here to help you!&lt;/p&gt;

&lt;h2&gt;
  
  
  Related blogs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/whats-new-in-react-19" rel="noopener noreferrer"&gt;What’s New in React 19?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/static-site-generators-gatsby-vs-next-js-in-2022" rel="noopener noreferrer"&gt;Static Site Generators: Gatsby vs. Next.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/optimize-next-js-app-bundle" rel="noopener noreferrer"&gt;Optimize Next.js App Bundle and Improve Its Performance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/write-css-react-next-js" rel="noopener noreferrer"&gt;Top 7 Ways to Write CSS in Your React or Next.js App&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/using-react-18-features-in-nextjs" rel="noopener noreferrer"&gt;Using React 18 Features in NextJS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>development</category>
      <category>web</category>
      <category>whatsnew</category>
    </item>
    <item>
      <title>How to Share Angular Code Between Projects?</title>
      <dc:creator>Gayathri-github7</dc:creator>
      <pubDate>Thu, 08 Aug 2024 17:29:02 +0000</pubDate>
      <link>https://dev.to/syncfusion/how-to-share-angular-code-between-projects-5f7e</link>
      <guid>https://dev.to/syncfusion/how-to-share-angular-code-between-projects-5f7e</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Discover the top practices for how to share Angular code between projects by exploring reusable modules, leveraging Nx for efficient code sharing, and ensuring maintainable, scalable architecture in your Angular applications.&lt;/p&gt;

&lt;p&gt;Sharing code across multiple &lt;a href="https://angular.dev/" rel="noopener noreferrer"&gt;Angular&lt;/a&gt; projects has numerous benefits, including increased productivity, enhanced consistency, cost efficiency, and improved maintainability. It allows developers to reuse well-tested components, services, and utilities, reducing duplication.&lt;/p&gt;

&lt;p&gt;Let’s look at the best practices for sharing Angular code between projects, including using module libraries, code organization, versioning, and maintenance of shared code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modularize code using Angular libraries
&lt;/h2&gt;

&lt;p&gt;Angular libraries are a powerful way to share code. These reusable packages can’t run independently and need to be imported into other apps.&lt;/p&gt;

&lt;p&gt;To create an Angular library, use the following command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ng generate library angular-lib-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once created, the library can be used in other apps. For example, &lt;strong&gt;reactive-forms&lt;/strong&gt; is a famous Angular library. To add it to the project, use the following command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ng add @angular/forms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, the &lt;strong&gt;ReactiveFormsModule&lt;/strong&gt;  from &lt;strong&gt;@angular/forms&lt;/strong&gt; can be imported into the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Nx for Monorepos
&lt;/h2&gt;

&lt;p&gt;A &lt;a href="https://en.wikipedia.org/wiki/Monorepo" rel="noopener noreferrer"&gt;monorepo&lt;/a&gt; is a single repository that contains code for different projects. &lt;a href="https://nx.dev/" rel="noopener noreferrer"&gt;Nx&lt;/a&gt; is a scalable monorepo building tool. It is fast and efficient and has many famous clients like Walmart, FedEx, and Shopify.&lt;/p&gt;

&lt;p&gt;To create an &lt;a href="https://www.syncfusion.com/blogs/post/a-complete-guide-to-running-a-full-stack-angular-application-in-a-monorepo" rel="noopener noreferrer"&gt;Angular monorepo&lt;/a&gt;, use the following command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-nx-workspace@latest angular-monorepo --preset=angular-monorepo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Furthermore, Nx has the ability to create local libraries, which will result in better reusability and better separation.&lt;/p&gt;

&lt;p&gt;For example, let’s consider a system where the domain areas are student, teacher, and staff. A new library can be created for each and every domain area.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nx g @nx/angular:library student --directory=libs/student --standalone 
nx g @nx/angular:library teacher --directory=libs/teacher --standalone 
nx g @nx/angular:library staff --directory=libs/staff --standalone

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

&lt;/div&gt;



&lt;p&gt;These libraries can be shared in other projects, as follows.&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="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;compilerOptions&lt;/span&gt;&lt;span class="dl"&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;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;paths&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@angular-monorepo/student&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;libs/student/src/index.ts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@angular-monorepo/teacher&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;libs/teacher/src/index.ts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@angular-monorepo/staff&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;libs/staff/src/index.ts&lt;/span&gt;&lt;span class="dl"&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;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;Therefore, using Nx for maintaining monorepos is extremely useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use feature modules
&lt;/h2&gt;

&lt;p&gt;Another best practice for sharing Angular code between projects is to create feature modules. As the system grows, it is recommended to separate each functionality into separate modules. For example, let’s consider the previous example of the system containing students, teachers, and staff. Separate modules can be created for all three types.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ng generate module student
ng generate module teacher
ng generate module staff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These feature modules can be easily imported into the &lt;strong&gt;app.module.ts&lt;/strong&gt; file as well as into other projects. Refer to the following code example.&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;HttpClientModule&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;@angular/common/http&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;NgModule&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;@angular/core&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;FormsModule&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;@angular/forms&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;BrowserModule&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;@angular/platform-browser&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;AppComponent&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;./app.component&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;StudentModule&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;./student/student.module&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;TeacherModule&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;./teacher/teacher.module&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;NgModule&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;declarations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;AppComponent&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;BrowserModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;FormsModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;HttpClientModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;StudentModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;TeacherModule&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;providers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
  &lt;span class="na"&gt;bootstrap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;AppComponent&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AppModule&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;This structure allows for easier maintenance and scalability as the app evolves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create shared modules
&lt;/h2&gt;

&lt;p&gt;It is recommended to create shared modules that contain similar functions. For example, date functions and math functions can be added into one module and can be shared.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&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;NgModule&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;@angular/core&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;CommonModule&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;@angular/common&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;ButtonComponent&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;./components/button/button.component&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;HighlightDirective&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;./directives/highlight.directive&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;DateFormatPipe&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;./pipes/date-format.pipe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;NgModule&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;declarations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;ButtonComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;HighlightDirective&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;DateFormatPipe&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;CommonModule&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;ButtonComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;HighlightDirective&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;DateFormatPipe&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SharedModule&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;This approach helps in maintaining consistency and reusability across different parts of the app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Versioning and dependency management
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Semantic versioning
&lt;/h3&gt;

&lt;p&gt;When sharing code through libraries, it’s crucial to follow semantic versioning &lt;strong&gt;(semver).&lt;/strong&gt; It provides a clear and predictable way to manage versions of your shared libraries, helping to communicate the impact of changes to the consumers of the library. The semantic versioning types include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Major version:&lt;/strong&gt; Incompatible API changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minor version:&lt;/strong&gt; Backward-compatible functionality.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Patch version:&lt;/strong&gt; Backward-compatible bug fixes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dependency management
&lt;/h3&gt;

&lt;p&gt;As a best practice, it is essential to manage the dependencies of the shared libraries. It is recommended to use a package manager like &lt;strong&gt;yarn&lt;/strong&gt; or &lt;strong&gt;npm&lt;/strong&gt; to manage the dependencies properly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integration tests
&lt;/h2&gt;

&lt;p&gt;To ensure the shared libraries are working as expected, it is essential to conduct integration tests. Unlike unit tests, which focus on individual components, integration tests verify the interactions among components, services, and modules.&lt;/p&gt;

&lt;p&gt;In the context of shared Angular libraries, it is essential to write integration tests to validate that the library functions correctly when used within various projects. Integration tests will help identify issues early, ensuring that the shared code works seamlessly across different environments and scenarios.&lt;/p&gt;

&lt;p&gt;To conduct integration tests, tools like Jasmine, Karma, or Jest can be used.&lt;/p&gt;

&lt;h2&gt;
  
  
  Continuous Integration/Continuous Deployment (CI/CD)
&lt;/h2&gt;

&lt;p&gt;CI/CD pipelines must be configured for shared Angular libraries. These pipelines automate the process of building, testing, and deploying code, ensuring that every change is validated before it is merged.&lt;/p&gt;

&lt;p&gt;This will reduce the risk of introducing bugs. Tools like GitHub Actions, Travis CI, and Jenkins can be configured to run tests, linting, and build processes automatically.&lt;/p&gt;

&lt;p&gt;Refer to the following code example of a simple GitHub Actions workflow for an Angular library.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: CI

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Use Node.js
        uses: actions/setup-node@v2
        with:
          node-version: '14'
      - run: npm install
      - run: npm run build
      - run: npm test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Additionally, these pipelines can be set up to publish new versions of the shared libraries to a private NPM registry or other package management system, streamlining the deployment process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proper documentation
&lt;/h2&gt;

&lt;p&gt;Shared Angular libraries should contain proper documentation for successful adoption and usage. It should include detailed usage examples, API references, and setup instructions to help developers understand how to integrate and use the library effectively. It should also cover common issues, troubleshooting tips, and best practices.&lt;/p&gt;

&lt;p&gt;One of the most famous Angular libraries is &lt;a href="https://material.angular.io/" rel="noopener noreferrer"&gt;Angular Material&lt;/a&gt;. It has a separate website that contains demos, setup instructions, and a guide.&lt;/p&gt;

&lt;p&gt;Well-documented libraries reduce the learning curve for new users and provide a single source of truth for all information related to the library. Tools like TypeDoc can be used to generate API documentation directly from the TypeScript code, ensuring that the documentation stays up to date with the codebase.&lt;/p&gt;

&lt;h2&gt;
  
  
  Consistent coding standards
&lt;/h2&gt;

&lt;p&gt;Maintaining consistent coding standards across all projects and shared libraries ensures code quality and readability. Establishing and enforcing these standards helps developers write clean, maintainable, and bug-free code.&lt;/p&gt;

&lt;p&gt;Tools like &lt;strong&gt;Prettier&lt;/strong&gt; and &lt;strong&gt;ESLint&lt;/strong&gt; can be used to maintain coding standards and quality guidelines, as follows.&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="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scripts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lint&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eslint . --ext .ts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;format&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prettier --write 'src/**/*.ts'&lt;/span&gt;&lt;span class="dl"&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;Consistent coding standards also enable easier code reviews and collaboration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backward compatibility
&lt;/h2&gt;

&lt;p&gt;When developing and updating shared libraries, it is important to ensure backward compatibility to avoid breaking existing implementations. Maintaining backward compatibility ensures that projects depending on the library do not face unexpected issues or require immediate changes when the library is updated. If breaking changes are necessary, they should be clearly documented, and a migration path should be provided to help users transition smoothly.&lt;/p&gt;

&lt;p&gt;Following semantic versioning helps communicate the nature of changes (e.g., major, minor, patch) to the users, allowing them to manage their dependencies accordingly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security
&lt;/h2&gt;

&lt;p&gt;Security is a critical consideration when sharing code between projects. Following best practices for security helps protect the shared libraries from vulnerabilities that could be exploited by malicious actors.&lt;/p&gt;

&lt;p&gt;It is essential to regularly audit the code for security vulnerabilities, use automated tools like  &lt;strong&gt;Snyk&lt;/strong&gt;  or  &lt;strong&gt;npm audit&lt;/strong&gt;, and address any issues promptly. Additionally, implementing secure coding practices, such as validating inputs, sanitizing outputs, and using secure dependencies, helps minimize the risk of security breaches.&lt;/p&gt;

&lt;p&gt;Properly managing access controls and permissions for the repository and CI/CD pipelines also ensures that only authorized personnel can make changes to the shared libraries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Thanks for reading this article! We have explored how sharing Angular code between projects can enhance productivity, maintain consistency, and ensure quality.&lt;/p&gt;

&lt;p&gt;Syncfusion &lt;a href="https://www.syncfusion.com/angular-components" rel="noopener noreferrer"&gt;Angular UI components&lt;/a&gt; library is the only suite that you will ever need to build an app since it contains over 85 high-performance, lightweight, modular, and responsive UI components in a single package.&lt;/p&gt;

&lt;p&gt;The new version of Essential Studio for Angular is available for existing customers on the &lt;a href="https://www.syncfusion.com/account/login" rel="noopener noreferrer"&gt;License and Downloads&lt;/a&gt; page. If you’re not yet a Syncfusion customer, sign up for our &lt;a href="https://www.syncfusion.com/downloads" rel="noopener noreferrer"&gt;30-day free trial&lt;/a&gt; to explore our features.&lt;/p&gt;

&lt;p&gt;If you have any questions, you can reach us through our &lt;a href="https://www.syncfusion.com/forums" rel="noopener noreferrer"&gt;support forum&lt;/a&gt;, &lt;a href="https://support.syncfusion.com/" rel="noopener noreferrer"&gt;support portal&lt;/a&gt;, or &lt;a href="https://www.syncfusion.com/feedback/" rel="noopener noreferrer"&gt;feedback portal&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Related blogs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/angular-dependency-injection-a-complete-guide" rel="noopener noreferrer"&gt;Angular Dependency Injection: A Complete Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/whats-new-in-angular-18" rel="noopener noreferrer"&gt;What’s New in Angular 18?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/angular-lifecycle-hooks-in-practice" rel="noopener noreferrer"&gt;Angular Lifecycle Hooks in Practice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/improve-load-time-angular-app" rel="noopener noreferrer"&gt;5 Tips to Improve the Load Time of an Angular Application&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>angular</category>
      <category>development</category>
      <category>tipsandtricks</category>
      <category>web</category>
    </item>
    <item>
      <title>Top 5 Techniques to Protect Web Apps from Unauthorized JavaScript Execution</title>
      <dc:creator>Gayathri-github7</dc:creator>
      <pubDate>Tue, 06 Aug 2024 15:30:38 +0000</pubDate>
      <link>https://dev.to/syncfusion/top-5-techniques-to-protect-web-apps-from-unauthorized-javascript-execution-435f</link>
      <guid>https://dev.to/syncfusion/top-5-techniques-to-protect-web-apps-from-unauthorized-javascript-execution-435f</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Keep your web app secure with these 5 vital techniques: validate and sanitize inputs, implement a content security policy, use subresource integrity, follow secure JavaScript practices, and conduct regular security audits. Protect web apps from unauthorized JavaScript execution and protect your users.&lt;/p&gt;

&lt;p&gt;In early 2024, a series of cyberattacks exploited stored cross-site scripting (XSS) &lt;a href="https://op-c.net/blog/active-exploitation-of-stored-xss-vulnerabilities-in-wordpress-plugins-cve-2024-2194-cve-2023-6961-cve-2023-40000/" rel="noopener noreferrer"&gt;vulnerabilities in popular WordPress plugins&lt;/a&gt; like WP Statistics, WP Meta SEO, and LiteSpeed Cache. These attacks allowed attackers to inject malicious JavaScript, compromising over 5 million active installations.&lt;/p&gt;

&lt;p&gt;As you can see, these attacks are a considerable threat to web applications nowadays. They can result in data leakage, identity theft, and, ultimately, loss of customer confidence. According to &lt;a href="https://www.hackerone.com/top-ten-vulnerabilities" rel="noopener noreferrer"&gt;HackerOne Research&lt;/a&gt;, XSS attacks constituted &lt;a href="https://www.comparitech.com/blog/information-security/cybersecurity-vulnerability-statistics/" rel="noopener noreferrer"&gt;23% of all reported security threats in 2020&lt;/a&gt;, making them the most frequent.&lt;/p&gt;

&lt;p&gt;This article will describe five techniques for safeguarding your app against unauthorized JavaScript executions.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Input validation and sanitization
&lt;/h2&gt;

&lt;p&gt;This primarily involves verifying whether the user’s input is within the expected format. For example, the data in the email text field should be a valid email address, and the data in the username text field should follow the expected username structure.&lt;/p&gt;

&lt;p&gt;Sanitization cleans this input by stripping out any malicious data that could be used in attacks such as &lt;a href="https://owasp.org/www-community/attacks/xss/" rel="noopener noreferrer"&gt;XSS&lt;/a&gt; and &lt;a href="https://www.w3schools.com/sql/sql_injection.asp" rel="noopener noreferrer"&gt;SQL injection&lt;/a&gt;. These two are critical security measures for any web app, and they serve as the first line of defense against malicious data that users might input.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to implement input validation and sanitization
&lt;/h3&gt;

&lt;h4&gt;
  
  
  a. Client-side form validation
&lt;/h4&gt;

&lt;p&gt;Client-side form validation is the initial check of the data validation process. However, this should never be solely relied upon for security purposes because JavaScript can be disabled or manipulated, easily bypassing client-side checks.&lt;/p&gt;

&lt;p&gt;Refer to the following code example of basic client-side validation using HTML 5.&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;form&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Email:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="err"&gt;required&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"Submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a more comprehensive look at client-side form validation, &lt;a href="https://developer.mozilla.org/en-US/docs/Learn/Forms/Form_validation" rel="noopener noreferrer"&gt;explore this detailed guide&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  b. Server-side validation
&lt;/h4&gt;

&lt;p&gt;Server-side validation ensures that all inputs are validated, regardless of the client-side validation status. It increases security by ensuring that malicious data never reaches your core app logic or database validation on the server. It is also less vulnerable to tampering.&lt;/p&gt;

&lt;p&gt;Refer to the following code example of basic server-side validation using Node.js with Express.&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&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;bodyParser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;body-parser&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bodyParser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlencoded&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;extended&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="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/submit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&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;emailRegex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;[^\s&lt;/span&gt;&lt;span class="sr"&gt;@&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;+@&lt;/span&gt;&lt;span class="se"&gt;[^\s&lt;/span&gt;&lt;span class="sr"&gt;@&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;\.[^\s&lt;/span&gt;&lt;span class="sr"&gt;@&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&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="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;emailRegex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;email&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="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Invalid email format.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// Process the valid email.&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Email is valid!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Server is running on port 3000&lt;/span&gt;&lt;span class="dl"&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;h4&gt;
  
  
  c. Sanitization
&lt;/h4&gt;

&lt;p&gt;Sanitization ensures that any potentially harmful data is removed or altered to a safe format. The following code example sanitizes input using the &lt;a href="https://www.npmjs.com/package/validator" rel="noopener noreferrer"&gt;validator&lt;/a&gt; library in Node.js.&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&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;bodyParser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;body-parser&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;validator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;validator&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bodyParser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlencoded&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;extended&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="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/submit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&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="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;validator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;email&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="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Invalid email format.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;validator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;normalizeEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// Process the sanitized email&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Email is valid and sanitized!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Server is running on port 3000&lt;/span&gt;&lt;span class="dl"&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;
  
  
  2. Content security policy (CSP)
&lt;/h2&gt;

&lt;p&gt;This is a strong security solution to guard web apps against threats such as XSS and data injection. Implementing CSP ensures that only scripts from specific, approved sources can run on your web pages. This significantly reduces the chance of malicious code execution.&lt;/p&gt;

&lt;p&gt;In simpler terms, think of CSP as a bouncer for your web app. It checks where the scripts come from and only lets in those from trusted sources, keeping the bad scripts out.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to implement CSP
&lt;/h3&gt;

&lt;p&gt;Implementing CSP involves adding CSP directives to your web server’s HTTP response header. &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy#directives" rel="noopener noreferrer"&gt;CSP directives&lt;/a&gt; are instructions that tell the browser which sources are permitted to load and execute content on a webpage. These directives provide granular control over various types of resources.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;default-src:&lt;/strong&gt; Sets a default policy for all content types.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;script-src:&lt;/strong&gt; Specifies allowed sources for JavaScript.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;style-src:&lt;/strong&gt; Specifies allowed sources for stylesheets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;img-src:&lt;/strong&gt; Specifies allowed sources for images.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;object-src:&lt;/strong&gt; Specifies allowed sources for plugins.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  How to add CSP to the HTTP response header
&lt;/h4&gt;

&lt;p&gt;You can add the CSP to the HTTP response header via your web server configuration. Refer to the following code example for setting up CSP in the Apache server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Header set Content-Security-Policy "default-src 'self'; img-src *"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For &lt;strong&gt;Nginx&lt;/strong&gt;, you can configure CSP as follows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;add_header Content-Security-Policy "default-src 'self'; img-src *"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  How to add your CSP via meta tags
&lt;/h4&gt;

&lt;p&gt;If you cannot access the web server’s configuration, you can include the CSP directly in your HTML file using a &lt;strong&gt;&lt;/strong&gt; tag. But this is &lt;a href="https://www.w3.org/TR/CSP3/" rel="noopener noreferrer"&gt;not the recommended way&lt;/a&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;head&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;http-equiv=&lt;/span&gt;&lt;span class="s"&gt;"Content-Security-Policy"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"default-src 'self'; img-src *"&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Sub-resource integrity (SRI)
&lt;/h2&gt;

&lt;p&gt;This security feature helps browsers check if the resources obtained from a third party (for instance, a &lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/CDN" rel="noopener noreferrer"&gt;CDN&lt;/a&gt;) have been modified. It allows you to provide a &lt;a href="https://www.hypr.com/security-encyclopedia/cryptographic-hash-function#:~:text=A%20cryptographic%20hash%20function%20(CHF)%20is%20an%20equation%20used%20to,size%20numerical%20string%20%E2%80%94%20the%20hash." rel="noopener noreferrer"&gt;cryptographic hash&lt;/a&gt; for these resources.&lt;/p&gt;

&lt;p&gt;When the browser gets the resource, it compares its hash to the given hash. If the hash does not match, the resources will not be loaded, thereby protecting your app from malicious modifications.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to implement SRI
&lt;/h3&gt;

&lt;p&gt;Implementing SRI involves adding a cryptographic hash to the integrity attribute of your &lt;strong&gt;&lt;/strong&gt; or &lt;strong&gt;&lt;/strong&gt; tags. Here’s a step-by-step guide to setting up SRI:&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 1: Generating the hash
&lt;/h4&gt;

&lt;p&gt;You must generate a hash for the resource you want to include in your webpage. This can be done using a tool or online service like the &lt;a href="https://www.srihash.org/" rel="noopener noreferrer"&gt;Subresource Integrity Generator tool&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 2: Adding the hash to your resource
&lt;/h4&gt;

&lt;p&gt;Once you have the hash, add it to the integrity attribute of the &lt;strong&gt;&lt;/strong&gt; or &amp;lt; &lt;strong&gt;link&amp;gt;&lt;/strong&gt;  tag.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&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;script&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/script.js"&lt;/span&gt; &lt;span class="na"&gt;integrity=&lt;/span&gt;&lt;span class="s"&gt;"sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxqAtD6x48V2aB1xzA7e2h53sF2aAuM"&lt;/span&gt; &lt;span class="na"&gt;crossorigin=&lt;/span&gt;&lt;span class="s"&gt;"anonymous"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, the integrity attribute contains the hash, and the &lt;strong&gt;crossorigin=”anonymous”&lt;/strong&gt; attribute ensures the resource is fetched with CORS (cross-origin resource sharing).&lt;/p&gt;

&lt;p&gt;You can use SRI for stylesheets, as well.&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;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/styles.css"&lt;/span&gt; &lt;span class="na"&gt;integrity=&lt;/span&gt;&lt;span class="s"&gt;"sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxqAtD6x48V2aB1xzA7e2h53sF2aAuM"&lt;/span&gt; &lt;span class="na"&gt;crossorigin=&lt;/span&gt;&lt;span class="s"&gt;"anonymous"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Secure JavaScript coding practices
&lt;/h2&gt;

&lt;p&gt;Secure JavaScript coding practices are crucial for developing web apps robust against various attacks, XSS, and other malicious exploits. By following these best practices, developers can ensure their code is secure, maintainable, and less vulnerable to unauthorized execution.&lt;/p&gt;

&lt;h3&gt;
  
  
  Avoid using eval()
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval" rel="noopener noreferrer"&gt;eval()&lt;/a&gt; function is a significant security risk, as it executes a string of code, potentially allowing attackers to inject malicious scripts. Always avoid using &lt;strong&gt;eval()&lt;/strong&gt; and similar functions like &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/setTimeout" rel="noopener noreferrer"&gt;setTimeout(string)&lt;/a&gt; and &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/setInterval" rel="noopener noreferrer"&gt;setInterval(string)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Why these functions are dangerous:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Arbitrary code execution:&lt;/strong&gt; These functions can execute any code passed to them as a string. If an attacker successfully inserts a malicious string, it will operate in the same way as the remaining code of your script.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Difficulty in code analysis:&lt;/strong&gt; Using these functions makes it harder to analyze the code for security vulnerabilities. Static analysis tools cannot examine the strings that are passed through such functions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic code injection:&lt;/strong&gt; Attackers can use these functions to inject and execute code dynamically that was not originally part of the app, bypassing traditional security measures.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use strict mode
&lt;/h3&gt;

&lt;p&gt;Enabling strict mode in JavaScript helps catch common coding mistakes and unsafe actions, such as assigning values to undeclared variables. This improves the security and stability of your code. To enable strict mode, add &lt;strong&gt;“use strict”;&lt;/strong&gt;  at the beginning of a script or a function.&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use strict&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;safeFunction&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Code in strict mode.&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;secureVariable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Secure&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;secureVariable&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;safeFunction&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Advantages and implications of enabling strict mode:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;In strict mode, this is undefined in functions that are not called methods.&lt;/li&gt;
&lt;li&gt;Strict mode will throw an error if a function has duplicate parameter names or an object literal has duplicate property names.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;with&lt;/strong&gt; statement is not allowed in the strict mode because it makes code difficult to predict and optimize.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Refer to the following code example.&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use strict&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Eliminates this coercion.&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;showThis&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&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="c1"&gt;// In non-strict mode, this would be the global object; in strict mode, it's undefined.&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;showThis&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Disallows duplicate property names or parameter values.&lt;/span&gt;
&lt;span class="c1"&gt;// This will throw an error in strict mode.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Prevents the use of with statement.&lt;/span&gt;
&lt;span class="c1"&gt;// This will throw an error in strict mode.&lt;/span&gt;
&lt;span class="nf"&gt;with &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;3.14&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;
  
  
  Avoid inline JavaScript
&lt;/h3&gt;

&lt;p&gt;Inline JavaScript can be significantly vulnerable to XSS attacks because it allows attackers to inject malicious scripts directly into your HTML. Instead, use external scripts to ensure all JavaScript is properly vetted and sanitized.&lt;/p&gt;

&lt;p&gt;Avoid inline JavaScript because of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ease of injection:&lt;/strong&gt; Inline JavaScript is more susceptible to injection attacks because it is part of the HTML content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CSP compliance:&lt;/strong&gt; Content security policies (CSP) can be more effectively enforced when JavaScript is kept in external files. Inline scripts often require the use of the unsafe-inline directive, which weakens CSP’s effectiveness.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintainability:&lt;/strong&gt; Keeping JavaScript in separate files makes the codebase easier to manage and maintain.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Refer to the following code example.&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="c"&gt;&amp;lt;!--&lt;/span&gt; &lt;span class="nx"&gt;Insecure&lt;/span&gt; &lt;span class="nx"&gt;Inline&lt;/span&gt; &lt;span class="nx"&gt;JavaScript&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!--&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onclick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;alert('Clicked!')&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Click&lt;/span&gt; &lt;span class="nx"&gt;Me&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&amp;gt; --&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!--&lt;/span&gt; &lt;span class="nx"&gt;Secure&lt;/span&gt; &lt;span class="nx"&gt;External&lt;/span&gt; &lt;span class="nx"&gt;JavaScript&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;button&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;secureButton&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Click&lt;/span&gt; &lt;span class="nx"&gt;Me&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&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="nx"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;secureButton&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Clicked!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Regular Security Audits and Updates
&lt;/h2&gt;

&lt;p&gt;Regular audits are essential for maintaining the integrity and security of web apps. By continuously assessing your app’s security, you can identify and fix vulnerabilities that could be exploited to execute unauthorized JavaScript or other malicious actions.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to conduct regular security audits
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Automated security scanning
&lt;/h4&gt;

&lt;p&gt;Use tools like &lt;a href="https://www.zaproxy.org/" rel="noopener noreferrer"&gt;OWASP ZAP&lt;/a&gt; or &lt;a href="https://portswigger.net/burp" rel="noopener noreferrer"&gt;Burp Suite&lt;/a&gt; to scan for known vulnerabilities. Automated scans provide a quick way to identify common security issues.&lt;/p&gt;

&lt;h4&gt;
  
  
  Manual code reviews
&lt;/h4&gt;

&lt;p&gt;Regularly review your codebase manually to catch issues that automated tools might miss. It’s better to use experienced developers and security experts for this.&lt;/p&gt;

&lt;h4&gt;
  
  
  Penetration testing
&lt;/h4&gt;

&lt;p&gt;Hire penetration testers to simulate attacks on your app, uncovering vulnerabilities that other methods might not detect.&lt;/p&gt;

&lt;h4&gt;
  
  
  Update dependencies
&lt;/h4&gt;

&lt;p&gt;Keep your dependencies updated to fix known vulnerabilities in libraries and frameworks. Use package managers like NPM or pip to manage updates.&lt;/p&gt;

&lt;h4&gt;
  
  
  Security training
&lt;/h4&gt;

&lt;p&gt;Continuously train your development team on the latest security practices and common vulnerabilities. This will ensure that your team is equipped to write secure code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concluding thoughts
&lt;/h2&gt;

&lt;p&gt;Thanks for reading this article. We hope these 5 techniques enhance your app’s defenses against unauthorized JavaScript executions. By implementing these strategies, you can reduce the risk of attacks and ensure a safer, more secure web app for your users. Remember, staying proactive and vigilant in your security measures is key to protecting your digital assets.&lt;/p&gt;

&lt;p&gt;Syncfusion &lt;a href="https://www.syncfusion.com/javascript-ui-controls" rel="noopener noreferrer"&gt;JavaScript UI controls&lt;/a&gt; library is the only suite that you will ever need to build an app since it contains over 85 high-performance, lightweight, modular, and responsive UI components in a single package.&lt;/p&gt;

&lt;p&gt;For current customers, the newest version of Essential Studio is available from the &lt;a href="https://www.syncfusion.com/account/login" rel="noopener noreferrer"&gt;License and Downloads&lt;/a&gt; page. If you are not a Syncfusion customer, you can always download our &lt;a href="https://www.syncfusion.com/downloads" rel="noopener noreferrer"&gt;free evaluation&lt;/a&gt; to see all our controls.&lt;/p&gt;

&lt;p&gt;You can also contact us through our &lt;a href="https://www.syncfusion.com/forums" rel="noopener noreferrer"&gt;support forum&lt;/a&gt;, &lt;a href="https://support.syncfusion.com/" rel="noopener noreferrer"&gt;support portal&lt;/a&gt;, or &lt;a href="https://www.syncfusion.com/feedback" rel="noopener noreferrer"&gt;feedback portal&lt;/a&gt;. We are always happy to assist you!&lt;/p&gt;

&lt;h2&gt;
  
  
  Related blogs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/render-flat-json-data-js-file-manager" rel="noopener noreferrer"&gt;Easily Render Flat JSON Data in JavaScript File Manager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/sync-javascript-controls-datamanager" rel="noopener noreferrer"&gt;Effortlessly Synchronize JavaScript Controls Using DataManager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/add-salesforce-javascript-scheduler" rel="noopener noreferrer"&gt;Optimizing Productivity: Integrate Salesforce with JavaScript Scheduler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/add-gantt-chart-into-power-bi" rel="noopener noreferrer"&gt;Empower Your Data Insights: Integrating JavaScript Gantt Chart into Power BI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>development</category>
      <category>security</category>
      <category>web</category>
    </item>
    <item>
      <title>Easily Synchronize Outlook Calendar Events in .NET MAUI Scheduler</title>
      <dc:creator>Gayathri-github7</dc:creator>
      <pubDate>Wed, 31 Jul 2024 11:52:31 +0000</pubDate>
      <link>https://dev.to/syncfusion/easily-synchronize-outlook-calendar-events-in-net-maui-scheduler-1olm</link>
      <guid>https://dev.to/syncfusion/easily-synchronize-outlook-calendar-events-in-net-maui-scheduler-1olm</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Easily synchronize Outlook Calendar events with the Syncfusion .NET MAUI Scheduler by configuring Microsoft Azure Active Directory, registering the app, setting API permissions, and integrating the Scheduler control into your .NET MAUI app. This setup allows seamless import and export of events between Outlook and the Scheduler.&lt;/p&gt;

&lt;p&gt;Maintaining multiple unsynchronized calendars confuses and increases the possibility of scheduling conflicts.  &lt;/p&gt;

&lt;p&gt;Let’s see how to synchronize the &lt;a href="https://support.microsoft.com/en-us/office/introduction-to-the-outlook-calendar-d94c5203-77c7-48ec-90a5-2e2bc10bd6f8" rel="noopener noreferrer"&gt;Microsoft Outlook Calendar&lt;/a&gt; events in the &lt;a href="https://www.syncfusion.com/maui-controls/maui-scheduler" rel="noopener noreferrer"&gt;Syncfusion .NET MAUI Scheduler&lt;/a&gt; and vice versa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure Microsoft Azure Active Directory service
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://learn.microsoft.com/en-us/graph/overview" rel="noopener noreferrer"&gt;Microsoft Graph&lt;/a&gt; allows developers to access protected &lt;strong&gt;Microsoft APIs&lt;/strong&gt; and integrate their apps with &lt;strong&gt;Microsoft products&lt;/strong&gt; like &lt;strong&gt;Outlook Calendar&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Follow these steps to configure the settings to read and write the &lt;strong&gt;Microsoft Office 365&lt;/strong&gt;  &lt;strong&gt;account&lt;/strong&gt;  &lt;strong&gt;Calendar&lt;/strong&gt; events:&lt;/p&gt;

&lt;p&gt;1.Log in to &lt;a href="https://portal.azure.com/#home" rel="noopener noreferrer"&gt;Microsoft Azure&lt;/a&gt; and select &lt;a href="https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/ApplicationsListBlade" rel="noopener noreferrer"&gt;App Registrations&lt;/a&gt;.&lt;br&gt;
2.On the &lt;strong&gt;App registration&lt;/strong&gt; page, select the &lt;strong&gt;New registration&lt;/strong&gt; option, fill in the application &lt;strong&gt;Name&lt;/strong&gt; (e.g., &lt;strong&gt;Synchronizing Outlook Calendar)&lt;/strong&gt;, and click Register.&lt;/p&gt;



  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5Zwtofne--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Register-app-in-Microsoft-Azure-1.png" alt="Register app in Microsoft Azure" width="800" height="498"&gt;Register app in Microsoft Azure

  



&lt;p&gt;3.Once the app is registered, navigate to the registered &lt;strong&gt;Synchronizing Outlook Calendar&lt;/strong&gt; application page, then select &lt;strong&gt;Authentication -&amp;gt;&lt;/strong&gt;   &lt;strong&gt;Add Platform&lt;/strong&gt;. On the &lt;strong&gt;Configure Platforms&lt;/strong&gt; page, select the required &lt;strong&gt;Mobile and desktop applications&lt;/strong&gt;.&lt;/p&gt;



  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3W3klX3J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Add-platform-for-registered-app.png" alt="Add platform for registered app" width="800" height="339"&gt;Add platform for registered app

  



&lt;p&gt;4.After selecting the platform configuration, select the required &lt;strong&gt;Redirect URIs&lt;/strong&gt; option and click &lt;strong&gt;Configure&lt;/strong&gt;.&lt;/p&gt;



  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_NP4iiOW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Configure-platform-for-registered-app.png" alt="Configure platform for registered app" width="800" height="338"&gt;Configure platform for registered app

  



&lt;p&gt;5.Then, we need to change the registered Synchronizing Outlook Calendar app and the API permissions to synchronize the Office 365 calendar events in your app. To do that, navigate to &lt;strong&gt;API&lt;/strong&gt;  &lt;strong&gt;permissions&lt;/strong&gt; in the left panel, select &lt;strong&gt;Add a permission&lt;/strong&gt;, and then select the &lt;strong&gt;Microsoft Graph&lt;/strong&gt; option.&lt;/p&gt;



  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AMpb3k9Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Request-API-permission-for-the-registered-app.png" alt="Request API permission for the registered app" width="800" height="343"&gt;Request API permission for the registered app

  



&lt;p&gt;6.Now, choose &lt;strong&gt;Delegated permissions&lt;/strong&gt; on the &lt;strong&gt;Microsoft Graph&lt;/strong&gt; page.&lt;/p&gt;



  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nZgDwZxs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Delegated-permission-for-registered-app.png" alt="Request Delegated permissions for registered app" width="800" height="340"&gt;Request Delegated permissions for registered app

  



&lt;p&gt;7.Search for &lt;strong&gt;Calendar&lt;/strong&gt; to enable Calendar API permission to &lt;strong&gt;ReadWrite&lt;/strong&gt; and then click &lt;strong&gt;AddPermissions&lt;/strong&gt;.&lt;/p&gt;



  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qNMFxQm8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Request-Outlook-Calendar-API-permission.png" alt="Request Outlook Calendar API permission" width="800" height="310"&gt;Request Outlook Calendar API permission

  



&lt;p&gt;8.We have configured the &lt;strong&gt;Microsoft Azure&lt;/strong&gt; service to access the Microsoft Calendar APIs. Now, you can use the &lt;strong&gt;Application (client) ID&lt;/strong&gt; and &lt;strong&gt;Directory (tenant) ID&lt;/strong&gt; of the registered &lt;strong&gt;Synchronizing Outlook Calendar&lt;/strong&gt; app to connect the &lt;strong&gt;Microsoft Azure AD service&lt;/strong&gt; with the &lt;strong&gt;.NET MAUI&lt;/strong&gt; project.&lt;/p&gt;



  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--f5cqD5C0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Registered-Application-Overview.png" alt="Registered Application Overview" width="800" height="270"&gt;Registered Application Overview

  


&lt;h2&gt;
  
  
  Creating appointments in the .NET MAUI Scheduler
&lt;/h2&gt;

&lt;p&gt;Next, we’ll see how to create appointments in the .NET MAUI Scheduler.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Before proceeding, please refer to the &lt;a href="https://help.syncfusion.com/maui/scheduler/getting-started" rel="noopener noreferrer"&gt;getting started with the .NET MAUI Scheduler documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;1.&lt;a href="https://www.nuget.org/packages/Syncfusion.Maui.Core/" rel="noopener noreferrer"&gt;Syncfusion.Maui.Core&lt;/a&gt; NuGet is a dependent package for all Syncfusion .NET MAUI controls. So, register the handler for Syncfusion Core in the &lt;strong&gt;MauiProgram.cs&lt;/strong&gt; file.&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;Syncfusion.Maui.Core.Hosting&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;UseMauiApp&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt;
   &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ConfigureSyncfusionCore&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2.Now, initialize the .NET MAUI Scheduler control in the &lt;strong&gt;MainPage.xaml&lt;/strong&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;xmlns:scheduler="clr-namespace:Syncfusion.Maui.Scheduler;assembly=Syncfusion.Maui.Scheduler"
&lt;span class="nt"&gt;&amp;lt;scheduler:SfScheduler&lt;/span&gt; &lt;span class="na"&gt;x:Name=&lt;/span&gt;&lt;span class="s"&gt;"Scheduler"&lt;/span&gt; &lt;span class="na"&gt;View=&lt;/span&gt;&lt;span class="s"&gt;"Month"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;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://res.cloudinary.com/practicaldev/image/fetch/s--rKsIrxZa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Integrating-Scheduler-control-in-the-.NET-MAUI-app.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rKsIrxZa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Integrating-Scheduler-control-in-the-.NET-MAUI-app.png" alt="Integrating Scheduler control in the .NET MAUI app" width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Integrating Scheduler control in the .NET MAUI app&lt;/p&gt;

&lt;p&gt;3.Let’s create an appointment model class with the required fields, such as &lt;strong&gt;EventName&lt;/strong&gt;, &lt;strong&gt;From&lt;/strong&gt; and &lt;strong&gt;To&lt;/strong&gt; dates in the .NET MAUI Scheduler.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Meeting.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;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Meeting&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;EventName&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;DateTime&lt;/span&gt; &lt;span class="n"&gt;From&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;DateTime&lt;/span&gt; &lt;span class="n"&gt;To&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;bool&lt;/span&gt; &lt;span class="n"&gt;IsAllDay&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;Brush&lt;/span&gt; &lt;span class="n"&gt;Background&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;RRule&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;4.Now, create events for the Scheduler in the view model class.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;SchedulerViewModel.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;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SchedulerViewModel&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;Meeting&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Meetings&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="nf"&gt;SchedulerViewModel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="n"&gt;Meetings&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;Meeting&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
       &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddSchedulerEvents&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;

   &lt;span class="c1"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
   &lt;span class="c1"&gt;/// Method to add events to scheduler.&lt;/span&gt;
   &lt;span class="c1"&gt;/// &amp;lt;/summary&amp;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;AddSchedulerEvents&lt;/span&gt;&lt;span class="p"&gt;()&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;colors&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;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Brush&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&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;SolidColorBrush&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromArgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"#FF8B1FA9"&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;SolidColorBrush&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromArgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"#FFD20100"&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;SolidColorBrush&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromArgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"#FFFC571D"&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;SolidColorBrush&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromArgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"#FF36B37B"&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;SolidColorBrush&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromArgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"#FF3D4FB5"&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;SolidColorBrush&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromArgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"#FFE47C73"&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;SolidColorBrush&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromArgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"#FF636363"&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;SolidColorBrush&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromArgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"#FF85461E"&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;SolidColorBrush&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromArgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"#FF0F8644"&lt;/span&gt;&lt;span class="p"&gt;)),&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;subjects&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;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="p"&gt;{&lt;/span&gt;
          &lt;span class="s"&gt;"Scrum Meeting"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s"&gt;"Review Meeting"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s"&gt;"Rating Discussion"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s"&gt;"Development Meeting"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s"&gt;"Sprint Review"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s"&gt;"Sprint Planning"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s"&gt;"Sprint Retrospective"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s"&gt;"General Meeting"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s"&gt;"Yoga Therapy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;};&lt;/span&gt;

      &lt;span class="n"&gt;Random&lt;/span&gt; &lt;span class="n"&gt;ran&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;Random&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;startdate&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;startdate&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;startdate&lt;/span&gt;&lt;span class="p"&gt;++)&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;meeting&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;Meeting&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
          &lt;span class="n"&gt;meeting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EventName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subjects&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ran&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;subjects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;)];&lt;/span&gt;
          &lt;span class="n"&gt;meeting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;From&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;Now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddDays&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;startdate&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;AddHours&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;9&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="n"&gt;meeting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;To&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;meeting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;From&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddHours&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="n"&gt;meeting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Background&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ran&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&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;Meetings&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;meeting&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;5.Finally, bind the custom &lt;strong&gt;Meetings&lt;/strong&gt; property from the &lt;strong&gt;SchedulerViewModel&lt;/strong&gt; class to the Scheduler’s &lt;a href="https://help.syncfusion.com/cr/maui/Syncfusion.Maui.Scheduler.SfScheduler.html#Syncfusion_Maui_Scheduler_SfScheduler_AppointmentsSource" rel="noopener noreferrer"&gt;AppointmentsSource&lt;/a&gt; using the &lt;a href="https://help.syncfusion.com/maui/scheduler/appointments#scheduler-appointment-source-mapping" rel="noopener noreferrer"&gt;appointment mapping&lt;/a&gt; feature.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;xmlns:scheduler="clr-namespace:Syncfusion.Maui.Scheduler;assembly=Syncfusion.Maui.Scheduler"
xmlns:local="clr-namespace:MauiSyncOutlookCalendar"
&lt;span class="nt"&gt;&amp;lt;Grid&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;Grid.BindingContext&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;local:SchedulerViewModel/&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/Grid.BindingContext&amp;gt;&lt;/span&gt; 

 &lt;span class="nt"&gt;&amp;lt;scheduler:SfScheduler&lt;/span&gt; &lt;span class="na"&gt;x:Name=&lt;/span&gt;&lt;span class="s"&gt;"Scheduler"&lt;/span&gt; &lt;span class="na"&gt;View=&lt;/span&gt;&lt;span class="s"&gt;"Month"&lt;/span&gt; &lt;span class="na"&gt;AppointmentsSource=&lt;/span&gt;&lt;span class="s"&gt;"{Binding Meetings}"&lt;/span&gt; &lt;span class="na"&gt;AllowedViews=&lt;/span&gt;&lt;span class="s"&gt;"Week,Month,TimelineMonth"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;scheduler:SfScheduler.AppointmentMapping&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;scheduler:SchedulerAppointmentMapping&lt;/span&gt;
              &lt;span class="na"&gt;Subject=&lt;/span&gt;&lt;span class="s"&gt;"EventName"&lt;/span&gt;
              &lt;span class="na"&gt;StartTime=&lt;/span&gt;&lt;span class="s"&gt;"From"&lt;/span&gt;
              &lt;span class="na"&gt;EndTime=&lt;/span&gt;&lt;span class="s"&gt;"To"&lt;/span&gt;
              &lt;span class="na"&gt;Background=&lt;/span&gt;&lt;span class="s"&gt;"Background"&lt;/span&gt;
              &lt;span class="na"&gt;RecurrenceRule=&lt;/span&gt;&lt;span class="s"&gt;"RRule"&lt;/span&gt;
              &lt;span class="na"&gt;IsAllDay=&lt;/span&gt;&lt;span class="s"&gt;"IsAllDay"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/scheduler:SfScheduler.AppointmentMapping&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/scheduler:SfScheduler&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Grid&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we have created the &lt;strong&gt;.NET MAUI Scheduler&lt;/strong&gt; application with custom appointments.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CFMkHRMl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Creating-custom-appointments-in-.NET-MAUI-Scheduler.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CFMkHRMl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Creating-custom-appointments-in-.NET-MAUI-Scheduler.png" alt="Creating custom appointments in .NET MAUI Scheduler" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Creating custom appointments in .NET MAUI Scheduler&lt;/p&gt;

&lt;h2&gt;
  
  
  Integrate Microsoft Authentication library in the .NET MAUI app
&lt;/h2&gt;

&lt;p&gt;Follow these steps to integrate the &lt;strong&gt;.NET MAUI&lt;/strong&gt; app and the &lt;strong&gt;Microsoft Azure&lt;/strong&gt;  &lt;strong&gt;AD&lt;/strong&gt; service.&lt;/p&gt;

&lt;p&gt;1.Install the &lt;a href="https://www.nuget.org/packages/Microsoft.Graph" rel="noopener noreferrer"&gt;Microsoft.Graph&lt;/a&gt; package in the Visual Studio by selecting &lt;strong&gt;Manage Nuget packages.&lt;/strong&gt; Then, add the following references to access the Microsoft Calendar API.&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.Graph&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Identity.Client&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2.Then, copy the &lt;strong&gt;Application (client) ID&lt;/strong&gt; and &lt;strong&gt;Directory (tenant) ID&lt;/strong&gt; from the registered app to connect to the &lt;strong&gt;Microsoft Azure AD service&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--d8qn3f_g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Copy-App-Directory-IDs-to-Connect.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d8qn3f_g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Copy-App-Directory-IDs-to-Connect.gif" alt="Copy App and Directory IDs to connect to Microsoft Azure AD service" width="779" height="263"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy App and Directory IDs to connect to Microsoft Azure AD service&lt;/p&gt;

&lt;p&gt;3.Create the &lt;strong&gt;authority&lt;/strong&gt; using &lt;strong&gt;Directory (tenant) ID&lt;/strong&gt;.&lt;br&gt;
4.Register the &lt;strong&gt;Application&lt;/strong&gt; (&lt;strong&gt;client) ID, Authority,&lt;/strong&gt; and &lt;strong&gt;Redirecturi&lt;/strong&gt; using the &lt;a href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.identity.client.ipublicclientapplication?view=azure-dotnet" rel="noopener noreferrer"&gt;IPublicClientApplication&lt;/a&gt;. To create a client app, refer to the following code example.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;App.xaml.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;internal&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;IPublicClientApplication&lt;/span&gt; &lt;span class="n"&gt;ClientApplication&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;clientID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tenantID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;authority&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;public&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;InitializeComponent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;//// You need to replace your Application or Client ID.&lt;/span&gt;
  &lt;span class="n"&gt;clientID&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;//// You need to replace your tenant ID.&lt;/span&gt;
  &lt;span class="n"&gt;tenantID&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;authority&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"https://login.microsoftonline.com/"&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;tenantID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;ClientApplication&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PublicClientApplicationBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clientID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WithAuthority&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;authority&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WithRedirectUri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://login.microsoftonline.com/common/oauth2/nativeclient"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&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;
  
  
  Connect the Microsoft Graph service client
&lt;/h2&gt;

&lt;p&gt;We can get the user token information using the &lt;a href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.identity.client.ipublicclientapplication.acquiretokeninteractive?view=azure-dotnet#microsoft-identity-client-ipublicclientapplication-acquiretokeninteractive(system-collections-generic-ienumerable((system-string)))" rel="noopener noreferrer"&gt;AcquireTokenInteractive&lt;/a&gt; and &lt;a href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.identity.client.iclientapplicationbase.acquiretokensilent?view=msal-dotnet-latest&amp;amp;viewFallbackFrom=azure-dotnet#microsoft-identity-client-iclientapplicationbase-acquiretokensilent(system-collections-generic-ienumerable((system-string))-microsoft-identity-client-iaccount)" rel="noopener noreferrer"&gt;AcquireTokenSilent&lt;/a&gt; methods of the &lt;a href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.identity.client.ipublicclientapplication?view=azure-dotnet" rel="noopener noreferrer"&gt;IPublicClientApplication&lt;/a&gt;. The &lt;a href="https://learn.microsoft.com/en-us/graph/sdks/create-client?tabs=CS" rel="noopener noreferrer"&gt;GraphServiceClient&lt;/a&gt; is used to get user information from the &lt;a href="https://graph.microsoft.com/v1.0/" rel="noopener noreferrer"&gt;Endpoint&lt;/a&gt; by registering the user token information of the &lt;a href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.identity.client.ipublicclientapplication?view=azure-dotnet" rel="noopener noreferrer"&gt;IPublicClientApplication&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SchedulerViewModel.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.Graph&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Identity.Client&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;GraphServiceClient&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;//// Scopes to access the Microsoft API permission.&lt;/span&gt;
&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&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;scopes&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"User.Read"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Calendars.Read"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Calendars.ReadWrite"&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="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Authenticate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;AuthenticationResult&lt;/span&gt; &lt;span class="n"&gt;tokenRequest&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;//// Registered the user token.&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;accounts&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;App&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClientApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetAccountsAsync&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;accounts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="n"&gt;tokenRequest&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;App&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClientApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AcquireTokenSilent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scopes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FirstOrDefault&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
       &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ExecuteAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="n"&gt;tokenRequest&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;App&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClientApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AcquireTokenInteractive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scopes&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;ExecuteAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;//// Connect the client information. &lt;/span&gt;
    &lt;span class="n"&gt;Client&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;GraphServiceClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://graph.microsoft.com/v1.0/"&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;DelegateAuthenticationProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;requestMessage&lt;/span&gt;&lt;span class="p"&gt;)&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;requestMessage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Authorization&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;AuthenticationHeaderValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"bearer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tokenRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AccessToken&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;We have now connected the &lt;strong&gt;.NET MAUI app&lt;/strong&gt; with &lt;strong&gt;Microsoft Azure&lt;/strong&gt;. Run the app; you will see the login page, as shown in the following image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PhmrdCdW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Office365-login-page.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PhmrdCdW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Office365-login-page.png" alt="Office365 login page" width="800" height="803"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Office365 login page&lt;/p&gt;

&lt;p&gt;Once you log in, you will be promoted with a &lt;strong&gt;Permission-requested&lt;/strong&gt; dialog. Read the terms and click the &lt;strong&gt;Accept&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5GXY7eBy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Application-permission.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5GXY7eBy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Application-permission.png" alt="Application permission" width="800" height="799"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Application permission&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If any details are mismatched, like the &lt;strong&gt;Application(client) ID,&lt;/strong&gt;  &lt;strong&gt;Directory&lt;/strong&gt; &lt;strong&gt;(tenant) ID,&lt;/strong&gt; or &lt;strong&gt;redirect URL&lt;/strong&gt;, you will get an error in connection, so add the proper details to avoid it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Synchronize the Outlook Calendar events to the .NET MAUI Scheduler
&lt;/h2&gt;

&lt;p&gt;Next, we’ll look at synchronizing or importing &lt;strong&gt;Outlook Calendar events&lt;/strong&gt; to the &lt;strong&gt;.NET MAUI Scheduler&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Refer to the following code example to design and add the import button.&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;Grid&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;Grid.DataContext&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;local:SchedulerViewModel/&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/Grid.DataContext&amp;gt;&lt;/span&gt;

 &lt;span class="nt"&gt;&amp;lt;StackPanel&lt;/span&gt; &lt;span class="na"&gt;Orientation=&lt;/span&gt;&lt;span class="s"&gt;"Horizontal"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Button&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Import Outlook Calendar Events to Syncfusion .NET MAUI Scheduler"&lt;/span&gt; &lt;span class="na"&gt;CornerRadius=&lt;/span&gt;&lt;span class="s"&gt;"20"&lt;/span&gt; &lt;span class="na"&gt;Command=&lt;/span&gt;&lt;span class="s"&gt;"{Binding ImportButtonCommand}"&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/StackPanel&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Grid&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the Import button clicks, &lt;strong&gt;Microsoft Azure&lt;/strong&gt; will be connected and import the &lt;strong&gt;Outlook Calendar events&lt;/strong&gt; to the &lt;strong&gt;Syncfusion .NET MAUI Scheduler&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&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="n"&gt;ICommand&lt;/span&gt; &lt;span class="n"&gt;ImportButtonCommand&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="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ExecuteImportCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;parameter&lt;/span&gt;&lt;span class="p"&gt;)&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="nf"&gt;Authenticate&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="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Authenticate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;import&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;AuthenticationResult&lt;/span&gt; &lt;span class="n"&gt;tokenRequest&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;accounts&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;App&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClientApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetAccountsAsync&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;accounts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;tokenRequest&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;App&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClientApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AcquireTokenSilent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scopes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FirstOrDefault&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ExecuteAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="k"&gt;else&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;tokenRequest&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;App&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClientApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AcquireTokenInteractive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scopes&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;ExecuteAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="n"&gt;Client&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;GraphServiceClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://graph.microsoft.com/v1.0/"&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;DelegateAuthenticationProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;requestMessage&lt;/span&gt;&lt;span class="p"&gt;)&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;requestMessage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Authorization&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;AuthenticationHeaderValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"bearer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tokenRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AccessToken&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;import&lt;/span&gt;&lt;span class="p"&gt;)&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="nf"&gt;GetOutlookCalendarEvents&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;Refer to the following code example to request Microsoft Outlook Calendar events.&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="c1"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;/// Method to get Outlook Calendar events.&lt;/span&gt;
&lt;span class="c1"&gt;/// &amp;lt;/summary&amp;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;GetOutlookCalendarEvents&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="c1"&gt;//// Request to get the Outlook calendar events.&lt;/span&gt;
   &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Me&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;GetAsync&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToList&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;events&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;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;0&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="n"&gt;Event&lt;/span&gt; &lt;span class="n"&gt;appointment&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="n"&gt;Meeting&lt;/span&gt; &lt;span class="n"&gt;meeting&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;Meeting&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
         &lt;span class="p"&gt;{&lt;/span&gt;
             &lt;span class="n"&gt;EventName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;appointment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
             &lt;span class="n"&gt;From&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Convert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToDateTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;appointment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Start&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;To&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Convert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToDateTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;appointment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;End&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;IsAllDay&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;appointment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsAllDay&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;appointment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Recurrence&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="nf"&gt;AddRecurrenceRule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;appointment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;meeting&lt;/span&gt;&lt;span class="p"&gt;);&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;Meetings&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;meeting&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;span class="c1"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;/// Method to update recurrence rule to appointments.&lt;/span&gt;
&lt;span class="c1"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;/// &amp;lt;param name="appointment"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;/// &amp;lt;param name="meeting"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;AddRecurrenceRule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Event&lt;/span&gt; &lt;span class="n"&gt;appointment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Meeting&lt;/span&gt; &lt;span class="n"&gt;meeting&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="c1"&gt;// Creating a recurrence rule.&lt;/span&gt;
   &lt;span class="n"&gt;SchedulerRecurrenceInfo&lt;/span&gt; &lt;span class="n"&gt;recurrenceProperties&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;SchedulerRecurrenceInfo&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;appointment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Recurrence&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pattern&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;RecurrencePatternType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Daily&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;recurrenceProperties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RecurrenceType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SchedulerRecurrenceType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Daily&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="k"&gt;else&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;appointment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Recurrence&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pattern&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;RecurrencePatternType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Weekly&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;recurrenceProperties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RecurrenceType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SchedulerRecurrenceType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Weekly&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;weekDay&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;appointment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Recurrence&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pattern&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DaysOfWeek&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;weekDay&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;MicrosoftDayOfWeek&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sunday&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
         &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;recurrenceProperties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WeekDays&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SchedulerWeekDays&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sunday&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;weekDay&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;MicrosoftDayOfWeek&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Monday&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
         &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;recurrenceProperties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WeekDays&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;recurrenceProperties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WeekDays&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;SchedulerWeekDays&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Monday&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;weekDay&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;MicrosoftDayOfWeek&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tuesday&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
         &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;recurrenceProperties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WeekDays&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;recurrenceProperties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WeekDays&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;SchedulerWeekDays&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tuesday&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;weekDay&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;MicrosoftDayOfWeek&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Wednesday&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
         &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;recurrenceProperties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WeekDays&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;recurrenceProperties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WeekDays&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;SchedulerWeekDays&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Wednesday&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;weekDay&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;MicrosoftDayOfWeek&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Thursday&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
         &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;recurrenceProperties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WeekDays&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;recurrenceProperties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WeekDays&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;SchedulerWeekDays&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Thursday&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;weekDay&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;MicrosoftDayOfWeek&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Friday&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
         &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;recurrenceProperties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WeekDays&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;recurrenceProperties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WeekDays&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;SchedulerWeekDays&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Friday&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;weekDay&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;MicrosoftDayOfWeek&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Saturday&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
         &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;recurrenceProperties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WeekDays&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;recurrenceProperties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WeekDays&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;SchedulerWeekDays&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Saturday&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;span class="n"&gt;recurrenceProperties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Interval&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;appointment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Recurrence&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pattern&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Interval&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="n"&gt;recurrenceProperties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RecurrenceRange&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SchedulerRecurrenceRange&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="n"&gt;recurrenceProperties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RecurrenceCount&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="n"&gt;meeting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RRule&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SchedulerRecurrenceManag&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;er&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GenerateRRule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;recurrenceProperties&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;meeting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;From&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;meeting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;To&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;
  
  
  Synchronize the .NET MAUI Scheduler events to Outlook Calendar events
&lt;/h2&gt;

&lt;p&gt;Let’s see how to synchronize or export the .NET MAUI Scheduler to the Outlook Calendar events.&lt;/p&gt;

&lt;p&gt;Refer to the following code example to design and add the export button.&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;Grid&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;Grid.DataContext&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;local:SchedulerViewModel/&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/Grid.DataContext&amp;gt;&lt;/span&gt;

 &lt;span class="nt"&gt;&amp;lt;Button&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Export Syncfusion .NET MAUI Scheduler Events to Outlook Calendar"&lt;/span&gt; &lt;span class="na"&gt;CornerRadius=&lt;/span&gt;&lt;span class="s"&gt;"20"&lt;/span&gt; &lt;span class="na"&gt;Command=&lt;/span&gt;&lt;span class="s"&gt;"{Binding ExportButtonCommand}"&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Grid&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the export button is clicked, the Syncfusion .NET MAUI Scheduler events will be exported to the Outlook Calendar.&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="n"&gt;ICommand&lt;/span&gt; &lt;span class="n"&gt;ExportButtonCommand&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="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ExecuteExportCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;parameter&lt;/span&gt;&lt;span class="p"&gt;)&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="nf"&gt;Authenticate&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="c1"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;/// Method to connect application authentication with Microsoft Azure. &lt;/span&gt;
&lt;span class="c1"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;/// &amp;lt;param name="import"&amp;gt;import or export events&amp;lt;/param&amp;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="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Authenticate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;import&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;AuthenticationResult&lt;/span&gt; &lt;span class="n"&gt;tokenRequest&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;accounts&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;App&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClientApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetAccountsAsync&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;accounts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="n"&gt;tokenRequest&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;App&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClientApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AcquireTokenSilent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scopes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FirstOrDefault&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ExecuteAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="n"&gt;tokenRequest&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;App&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClientApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AcquireTokenInteractive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scopes&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;ExecuteAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;Client&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;GraphServiceClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://graph.microsoft.com/v1.0/"&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;DelegateAuthenticationProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&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;=&amp;gt;&lt;/span&gt;
             &lt;span class="p"&gt;{&lt;/span&gt;
                 &lt;span class="n"&gt;requestMessage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Authorization&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;Au&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="nf"&gt;thenticationHeaderValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"bearer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tokenRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AccessToken&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;import&lt;/span&gt;&lt;span class="p"&gt;)&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="nf"&gt;AddEventToOutlookCalendar&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;Refer to the following code example to request the addition of .NET MAUI Scheduler events to the Outlook Calendar events.&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="c1"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;/// Method to add an event to Outlook Calendar.&lt;/span&gt;
&lt;span class="c1"&gt;/// &amp;lt;/summary&amp;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;AddEventToOutlookCalendar&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="n"&gt;Meeting&lt;/span&gt; &lt;span class="n"&gt;meeting&lt;/span&gt; &lt;span class="k"&gt;in&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;Meetings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="n"&gt;Event&lt;/span&gt; &lt;span class="n"&gt;calendarEvent&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;Event&lt;/span&gt;
         &lt;span class="p"&gt;{&lt;/span&gt;
             &lt;span class="n"&gt;Subject&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;meeting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EventName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
             &lt;span class="n"&gt;Start&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;DateTimeTimeZone&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;meeting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;From&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                 &lt;span class="n"&gt;TimeZone&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"GMT Standard Time"&lt;/span&gt;
             &lt;span class="p"&gt;},&lt;/span&gt;
             &lt;span class="n"&gt;End&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;DateTimeTimeZone&lt;/span&gt;&lt;span class="p"&gt;()&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;meeting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;To&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                 &lt;span class="n"&gt;TimeZone&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"GMT Standard Time"&lt;/span&gt;
             &lt;span class="p"&gt;},&lt;/span&gt;
         &lt;span class="p"&gt;};&lt;/span&gt;
         &lt;span class="c1"&gt;//// Request to add Syncfusion Scheduler event to the Outlook Calendar events.&lt;/span&gt;
         &lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Me&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;AddAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calendarEvent&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;Refer to the following image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2x6TW8f_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Synchronizing-Outlook-Calendar-events-in-.NET-MAUI-Scheduler.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2x6TW8f_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Synchronizing-Outlook-Calendar-events-in-.NET-MAUI-Scheduler.png" alt="Synchronizing Outlook Calendar events in .NET MAUI Scheduler" width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Synchronizing Outlook Calendar events in .NET MAUI Scheduler&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub reference
&lt;/h2&gt;

&lt;p&gt;For more details, refer to the &lt;a href="https://github.com/SyncfusionExamples/Synchronizing-Outlook-Calendar-Events-with-the-.NET-MAUI-Schedule" rel="noopener noreferrer"&gt;Synchronizing Outlook Calendar events in the .NET MAUI Scheduler GitHub demo&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Thanks for reading! In this blog, we’ve seen how to synchronize the &lt;a href="https://www.syncfusion.com/maui-controls/maui-scheduler" rel="noopener noreferrer"&gt;Syncfusion .NET MAUI Scheduler&lt;/a&gt; events with Microsoft Outlook Calendar events and vice versa. This functionality is perfect for keeping your work and personal appointments in sync, enhancing your productivity and organization. Give it a try, and leave your feedback in the comment section below.&lt;/p&gt;

&lt;p&gt;For current customers, the newest version of Essential Studio for .NET MAUI is available from the &lt;a href="https://www.syncfusion.com/account/downloads" rel="noopener noreferrer"&gt;License and Downloads&lt;/a&gt; page. If you are not a Syncfusion customer, you can always download our &lt;a href="https://www.syncfusion.com/downloads" rel="noopener noreferrer"&gt;free evaluation&lt;/a&gt; to see all our controls.&lt;/p&gt;

&lt;p&gt;You can also contact us through our &lt;a href="https://www.syncfusion.com/forums" rel="noopener noreferrer"&gt;support forum&lt;/a&gt;, &lt;a href="https://support.syncfusion.com/" rel="noopener noreferrer"&gt;support portal&lt;/a&gt;, or &lt;a href="https://www.syncfusion.com/feedback/home" rel="noopener noreferrer"&gt;feedback portal&lt;/a&gt;. As always, we are happy to assist you!&lt;/p&gt;

&lt;h2&gt;
  
  
  Related blogs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/make-payment-easy-maui-radio-button" rel="noopener noreferrer"&gt;Making Payments Easy: Using .NET MAUI Radio Button for Payment Apps and Digital Wallets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/search-products-dotnet-maui-checkbox" rel="noopener noreferrer"&gt;Mastering Shopping: Enhancing Your Product Search with the .NET MAUI CheckBox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/zoom-view-pdf-in-callout-dotnet-maui" rel="noopener noreferrer"&gt;How to Zoom and View the Desired Area in a PDF using .NET MAUI PDF Viewer?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/new-built-in-toolbar-maui-pdf-viewer" rel="noopener noreferrer"&gt;Enhance PDF Viewing and Editing with the New Built-in Toolbar in .NET MAUI PDF Viewer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/achieve-outlook-like-swiping-using-net-maui-listview" rel="noopener noreferrer"&gt;Achieve Outlook-Like Swiping Using .NET MAUI ListView&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>dotnetmaui</category>
      <category>development</category>
      <category>mobile</category>
      <category>scheduler</category>
    </item>
    <item>
      <title>Design a Timer App using .NET MAUI Radial Gauge and Timer Picker</title>
      <dc:creator>Gayathri-github7</dc:creator>
      <pubDate>Tue, 30 Jul 2024 15:17:56 +0000</pubDate>
      <link>https://dev.to/gayathrigithub7/design-a-timer-app-using-net-maui-radial-gauge-and-timer-picker-4pai</link>
      <guid>https://dev.to/gayathrigithub7/design-a-timer-app-using-net-maui-radial-gauge-and-timer-picker-4pai</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Learn to design a timer app using Syncfusion .NET MAUI Radial Gauge and Time Picker controls. This guide covers creating a .NET MAUI app, integrating and customizing the controls, and adding functionalities like start, pause, and cancel for the timer. Visually represent timer progress efficiently with customizable axes, pointers, and annotations. &lt;/p&gt;

&lt;p&gt;A timer app measures time intervals and typically displays the elapsed time in hours, minutes, and seconds. This versatile tool is designed to help you manage time more efficiently. Whether you want to stay productive, execute workouts, or even cook the perfect meal, a timer app can be your best companion.&lt;/p&gt;

&lt;p&gt;In this blog, we’ll see how to design a timer app using the Syncfusion &lt;a href="https://www.syncfusion.com/maui-controls/maui-radial-gauge" rel="noopener noreferrer"&gt;.NET MAUI Radial Gauge&lt;/a&gt; and &lt;a href="https://www.syncfusion.com/maui-controls/maui-timepicker" rel="noopener noreferrer"&gt;Time Picker&lt;/a&gt; controls.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a .NET MAUI app
&lt;/h2&gt;

&lt;p&gt;First, &lt;a href="https://learn.microsoft.com/en-us/dotnet/maui/get-started/first-app?view=net-maui-8.0&amp;amp;tabs=vswin&amp;amp;pivots=devices-android" rel="noopener noreferrer"&gt;create a new .NET MAUI application in Visual Studio&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Register the handler for Syncfusion Core
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.nuget.org/packages/Syncfusion.Maui.Core/" rel="noopener noreferrer"&gt;Syncfusion.Maui.Core&lt;/a&gt; NuGet is a dependent package for all Syncfusion .NET MAUI controls (in this case, Radial Gauge and Time Picker). Register the handler for Syncfusion core in the &lt;strong&gt;MauiProgram.cs&lt;/strong&gt; file.&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;Syncfusion.Maui.Core.Hosting&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;UseMauiApp&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt;
   &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ConfigureSyncfusionCore&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Integrate the .NET MAUI Timer Picker to set the duration of the timer
&lt;/h2&gt;

&lt;p&gt;The Syncfusion &lt;a href="https://help.syncfusion.com/maui/timepicker/getting-started" rel="noopener noreferrer"&gt;.NET MAUI Time Picker&lt;/a&gt; allows you to select the time and visualize its items inside a popup or a drop-down UI element. Here, we’ll use it to set the duration for the timer app.&lt;/p&gt;

&lt;p&gt;Refer to the following code example to initialize and customize the Time Picker.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MainPage.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:picker="clr-namespace:Syncfusion.Maui.Picker;assembly=Syncfusion.Maui.Picker"

&lt;span class="nt"&gt;&amp;lt;picker:SfTimePicker&lt;/span&gt; &lt;span class="na"&gt;Background=&lt;/span&gt;&lt;span class="s"&gt;"#E8E4FF"&lt;/span&gt; &lt;span class="na"&gt;HorizontalOptions=&lt;/span&gt;&lt;span class="s"&gt;"Fill"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;picker:SfTimePicker.HeaderView&lt;/span&gt; &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;picker:PickerHeaderView&lt;/span&gt; &lt;span class="na"&gt;Background=&lt;/span&gt;&lt;span class="s"&gt;"#E8E4FF"&lt;/span&gt; &lt;span class="na"&gt;Height=&lt;/span&gt;&lt;span class="s"&gt;"40"&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Time Picker"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/picker:PickerHeaderView&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/picker:SfTimePicker.HeaderView&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;picker:SfTimePicker.ColumnHeaderView&lt;/span&gt; &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;picker:TimePickerColumnHeaderView&lt;/span&gt; &lt;span class="na"&gt;Background=&lt;/span&gt;&lt;span class="s"&gt;"#E8E4FF"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/picker:TimePickerColumnHeaderView&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/picker:SfTimePicker.ColumnHeaderView&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/picker:SfTimePicker&amp;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://res.cloudinary.com/practicaldev/image/fetch/s--AamSmkcD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Integrating-Time-Picker-in-the-.NET-MAUI-app-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AamSmkcD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Integrating-Time-Picker-in-the-.NET-MAUI-app-1.png" alt="Integrating Time Picker in the .NET MAUI app" width="401" height="551"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Integrating Time Picker in the .NET MAUI app&lt;/p&gt;

&lt;h2&gt;
  
  
  Designing a timer app using .NET MAUI Radial Gauge
&lt;/h2&gt;

&lt;p&gt;Follow these steps to design a timer app that displays the time selected in the .NET MAUI Time Picker to the Radial Gauge control:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Define a model class to bind the values to the Radial Gauge and Time Picker
&lt;/h3&gt;

&lt;p&gt;Let’s create a &lt;strong&gt;Timer&lt;/strong&gt; model class to bind the values to the Radial Gauge and Time Picker. Refer to the following code example where the,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SelectedTime&lt;/strong&gt; property updates the selected time in the Time Picker in two-way mode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TimerPointerValue&lt;/strong&gt; property updates the elapsed timer value in the Radial Gauge pointer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TimerTime&lt;/strong&gt; property displays the elapsed time in the Radial Gauge annotation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ReminderTime&lt;/strong&gt; property displays the reminder time of the timer duration in the Radial Gauge annotation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;TimerModel.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;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TimerModel&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;string&lt;/span&gt; &lt;span class="n"&gt;reminderTime&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;timerTime&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;timerPointerValue&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;TimeSpan&lt;/span&gt; &lt;span class="n"&gt;selectedTime&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;TimeSpan&lt;/span&gt; &lt;span class="n"&gt;SelectedTime&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;selectedTime&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;selectedTime&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="k"&gt;this&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;SelectedTime&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;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;ReminderTime&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;reminderTime&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;reminderTime&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="k"&gt;this&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;ReminderTime&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;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;TimerTime&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;timerTime&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;timerTime&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="k"&gt;this&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;TimerTime&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;public&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;TimerPointerValue&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;timerPointerValue&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;timerPointerValue&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="k"&gt;this&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;TimerPointerValue&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;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;public&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Determining the timer app time from the .NET MAUI Time Picker’s selected time
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.maui.dispatching.idispatchertimer?view=net-maui-8.0" rel="noopener noreferrer"&gt;IDispatcherTimer&lt;/a&gt; provides a timer integrated into the &lt;a href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.maui.dispatching.dispatcher?view=net-maui-8.0" rel="noopener noreferrer"&gt;Dispatcher&lt;/a&gt; queue. It is executed at specified intervals to determine the elapsed time and pointer value of the Radial Gauge based on the time selected in the Time Picker.&lt;/p&gt;

&lt;p&gt;Using the &lt;a href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.maui.dispatching.dispatcher.createtimer?view=net-maui-8.0" rel="noopener noreferrer"&gt;CreateTimer&lt;/a&gt; method, create an instance of the &lt;a href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.maui.dispatching.idispatchertimer?view=net-maui-8.0" rel="noopener noreferrer"&gt;IDispatcherTimer&lt;/a&gt; object associated with the &lt;a href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.maui.dispatching.dispatcher?view=net-maui-8.0" rel="noopener noreferrer"&gt;Dispatcher&lt;/a&gt; and set the &lt;a href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.maui.dispatching.idispatchertimer.interval?view=net-maui-8.0#microsoft-maui-dispatching-idispatchertimer-interval" rel="noopener noreferrer"&gt;Interval&lt;/a&gt; value to &lt;strong&gt;run&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TimerViewModel.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;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TimerViewModel&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;TimeSpan&lt;/span&gt; &lt;span class="n"&gt;timerTick&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;IDispatcherTimer&lt;/span&gt; &lt;span class="n"&gt;timer&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;TimerModel&lt;/span&gt; &lt;span class="n"&gt;TimerModel&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="nf"&gt;TimerViewModel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="n"&gt;timerTick&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;TimeSpan&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;dispatcher&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Dispatcher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetForCurrentThread&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;dispatcher&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timer&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dispatcher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateTimer&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;timer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Interval&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;TimeSpan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timer&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tick&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;Timer_Tick&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;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Timer_Tick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;EventArgs&lt;/span&gt; &lt;span class="n"&gt;e&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;timerTick&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;TimeSpan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Zero&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="n"&gt;timerTick&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;timerTick&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Subtract&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;TimeSpan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&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;time&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timerTick&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;TimerModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SelectedTime&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="m"&gt;100&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;TimerModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TimerPointerValue&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&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;TimerModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TimerTime&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;timerTick&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@"hh\:mm\:ss"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="k"&gt;else&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;TimerModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TimerPointerValue&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&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;h3&gt;
  
  
  Step 3: Bind the Time Picker selected time
&lt;/h3&gt;

&lt;p&gt;Once time is selected in the .NET MAUI Time Picker, we can use the selected time to determine the Timer time and reminder time to the Radial Gauge.&lt;/p&gt;

&lt;p&gt;Refer to the following code example. Here, we’ll set the &lt;strong&gt;BindingContext&lt;/strong&gt; and bind the Time Picker’s &lt;a href="https://help.syncfusion.com/cr/maui/Syncfusion.Maui.Picker.SfTimePicker.html#Syncfusion_Maui_Picker_SfTimePicker_SelectedTime" rel="noopener noreferrer"&gt;SelectedTime&lt;/a&gt; property using the &lt;strong&gt;SelectedTime&lt;/strong&gt; property of the &lt;strong&gt;TimerModel&lt;/strong&gt; class from the &lt;strong&gt;TimerViewModel&lt;/strong&gt; class.&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.BindingContext&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;local:TimerViewModel/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ContentPage.BindingContext&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;picker:SfTimePicker&lt;/span&gt; &lt;span class="na"&gt;Background=&lt;/span&gt;&lt;span class="s"&gt;"#E8E4FF"&lt;/span&gt; &lt;span class="na"&gt;HorizontalOptions=&lt;/span&gt;&lt;span class="s"&gt;"Fill"&lt;/span&gt; &lt;span class="na"&gt;SelectedTime=&lt;/span&gt;&lt;span class="s"&gt;"{Binding TimerModel.SelectedTime,Mode=TwoWay}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Initialize the .NET MAUI Radial Gauge
&lt;/h3&gt;

&lt;p&gt;The Syncfusion &lt;a href="https://help.syncfusion.com/maui/radial-gauge/getting-started" rel="noopener noreferrer"&gt;.NET MAUI Radial Gauge&lt;/a&gt; can be used to display the elapsed time on a circular scale and includes customizable axes, pointers, and annotations to show the timer details.&lt;/p&gt;

&lt;p&gt;Refer to the following code example to initialize the &lt;strong&gt;Radial Gauge&lt;/strong&gt; control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MainPage.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:gauge="clr-namespace:Syncfusion.Maui.Gauges;assembly=Syncfusion.Maui.Gauges"

&lt;span class="nt"&gt;&amp;lt;gauge:SfRadialGauge&lt;/span&gt; &lt;span class="na"&gt;Background=&lt;/span&gt;&lt;span class="s"&gt;"#E8E4FF"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Customize the Radial Gauge axis angle
&lt;/h3&gt;

&lt;p&gt;To design the timer app, we’ll set the Radial Gauge axis’ &lt;a href="https://help.syncfusion.com/cr/maui/Syncfusion.Maui.Gauges.RadialAxis.html#Syncfusion_Maui_Gauges_RadialAxis_StartAngle" rel="noopener noreferrer"&gt;StartAngle&lt;/a&gt; and &lt;a href="https://help.syncfusion.com/cr/maui/Syncfusion.Maui.Gauges.RadialAxis.html#Syncfusion_Maui_Gauges_RadialAxis_EndAngle" rel="noopener noreferrer"&gt;EndAngle&lt;/a&gt; to 270 degrees. By default, the Radial Gauge axis’ start angle is zero and updates clockwise.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MainPage.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;gauge:SfRadialGauge&lt;/span&gt; &lt;span class="na"&gt;Background=&lt;/span&gt;&lt;span class="s"&gt;"#E8E4FF"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;gauge:SfRadialGauge.Axes&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;gauge:RadialAxis&lt;/span&gt; &lt;span class="na"&gt;ShowLabels=&lt;/span&gt;&lt;span class="s"&gt;"False"&lt;/span&gt;  
         &lt;span class="na"&gt;StartAngle=&lt;/span&gt;&lt;span class="s"&gt;"270"&lt;/span&gt;
         &lt;span class="na"&gt;EndAngle=&lt;/span&gt;&lt;span class="s"&gt;"270"&lt;/span&gt;
         &lt;span class="na"&gt;ShowAxisLine=&lt;/span&gt;&lt;span class="s"&gt;"False"&lt;/span&gt;
         &lt;span class="na"&gt;ShowTicks=&lt;/span&gt;&lt;span class="s"&gt;"False"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/gauge:RadialAxis&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/gauge:SfRadialGauge.Axes&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/gauge:SfRadialGauge&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 6: Customize the Radial Gauge axis pointer value
&lt;/h3&gt;

&lt;p&gt;Let’s add a &lt;a href="https://help.syncfusion.com/cr/maui/Syncfusion.Maui.Gauges.RangePointer.html" rel="noopener noreferrer"&gt;RangePointer&lt;/a&gt; to display the elapsed timer value in the Radial Gauge &lt;a href="https://help.syncfusion.com/cr/maui/Syncfusion.Maui.Gauges.RadialAxis.html#Syncfusion_Maui_Gauges_RadialAxis_Pointers" rel="noopener noreferrer"&gt;Pointers&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Refer to the following code example to bind the pointer value to the Radial Gauge axis using the &lt;strong&gt;TimerPointerValue&lt;/strong&gt; property of the &lt;strong&gt;TimerModel&lt;/strong&gt; class from the &lt;strong&gt;TimerViewModel&lt;/strong&gt; BindingContext class.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MainPage.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.BindingContext&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;local:TimerViewModel/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ContentPage.BindingContext&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;gauge:SfRadialGauge&lt;/span&gt; &lt;span class="na"&gt;Background=&lt;/span&gt;&lt;span class="s"&gt;"#E8E4FF"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;gauge:SfRadialGauge.Axes&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;gauge:RadialAxis&lt;/span&gt; &lt;span class="na"&gt;ShowLabels=&lt;/span&gt;&lt;span class="s"&gt;"False"&lt;/span&gt;  
         &lt;span class="na"&gt;StartAngle=&lt;/span&gt;&lt;span class="s"&gt;"270"&lt;/span&gt;
         &lt;span class="na"&gt;EndAngle=&lt;/span&gt;&lt;span class="s"&gt;"270"&lt;/span&gt;
         &lt;span class="na"&gt;ShowAxisLine=&lt;/span&gt;&lt;span class="s"&gt;"False"&lt;/span&gt;
         &lt;span class="na"&gt;ShowTicks=&lt;/span&gt;&lt;span class="s"&gt;"False"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;gauge:RadialAxis.Pointers&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;gauge:RangePointer&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;"100"&lt;/span&gt; &lt;span class="na"&gt;Fill=&lt;/span&gt;&lt;span class="s"&gt;"#EEEEEE"&lt;/span&gt; &lt;span class="na"&gt;CornerStyle=&lt;/span&gt;&lt;span class="s"&gt;"BothCurve"&lt;/span&gt; &lt;span class="na"&gt;PointerWidth=&lt;/span&gt;&lt;span class="s"&gt;"14"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;gauge:RangePointer&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;"{Binding TimerModel.TimerPointerValue}"&lt;/span&gt; &lt;span class="na"&gt;CornerStyle=&lt;/span&gt;&lt;span class="s"&gt;"BothCurve"&lt;/span&gt; &lt;span class="na"&gt;Fill=&lt;/span&gt;&lt;span class="s"&gt;"#6750A4"&lt;/span&gt; &lt;span class="na"&gt;PointerWidth=&lt;/span&gt;&lt;span class="s"&gt;"14"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/gauge:RadialAxis.Pointers&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/gauge:RadialAxis&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/gauge:SfRadialGauge.Axes&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/gauge:SfRadialGauge&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 7: Customize the Radial Gauge axis annotation
&lt;/h3&gt;

&lt;p&gt;The elapsed time and reminder can be displayed in the Radial Gauge axis using the &lt;a href="https://help.syncfusion.com/cr/maui/Syncfusion.Maui.Gauges.GaugeAnnotation.html" rel="noopener noreferrer"&gt;annotations&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Refer to the following code example. Here, we’ll add the elapsed time and reminder time text to the Radial Gauge using the &lt;strong&gt;TimerTime&lt;/strong&gt; and &lt;strong&gt;ReminderTime&lt;/strong&gt; properties of the &lt;strong&gt;TimerModel&lt;/strong&gt; class from the &lt;strong&gt;TimerViewModel&lt;/strong&gt; BindingContext class.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MainPage.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.BindingContext&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;local:TimerViewModel/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ContentPage.BindingContext&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;gauge:SfRadialGauge&lt;/span&gt; &lt;span class="na"&gt;Background=&lt;/span&gt;&lt;span class="s"&gt;"#E8E4FF"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;gauge:SfRadialGauge.Axes&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;gauge:RadialAxis&lt;/span&gt; &lt;span class="na"&gt;ShowLabels=&lt;/span&gt;&lt;span class="s"&gt;"False"&lt;/span&gt;  
         &lt;span class="na"&gt;StartAngle=&lt;/span&gt;&lt;span class="s"&gt;"270"&lt;/span&gt;
         &lt;span class="na"&gt;EndAngle=&lt;/span&gt;&lt;span class="s"&gt;"270"&lt;/span&gt;
         &lt;span class="na"&gt;ShowAxisLine=&lt;/span&gt;&lt;span class="s"&gt;"False"&lt;/span&gt;
         &lt;span class="na"&gt;ShowTicks=&lt;/span&gt;&lt;span class="s"&gt;"False"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;gauge:RadialAxis.Annotations&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;gauge:GaugeAnnotation&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;gauge:GaugeAnnotation.Content&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;VerticalStackLayout&amp;gt;&lt;/span&gt;
       &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Timer"&lt;/span&gt; &lt;span class="na"&gt;HorizontalOptions=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
       &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"{Binding TimerModel.TimerTime}"&lt;/span&gt; 
              &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"22"&lt;/span&gt;
              &lt;span class="na"&gt;TextColor=&lt;/span&gt;&lt;span class="s"&gt;"Black"&lt;/span&gt;
              &lt;span class="na"&gt;FontAttributes=&lt;/span&gt;&lt;span class="s"&gt;"Bold"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/VerticalStackLayout&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;/gauge:GaugeAnnotation.Content&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/gauge:GaugeAnnotation&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;gauge:GaugeAnnotation&lt;/span&gt; &lt;span class="na"&gt;DirectionUnit=&lt;/span&gt;&lt;span class="s"&gt;"Angle"&lt;/span&gt;
           &lt;span class="na"&gt;DirectionValue=&lt;/span&gt;&lt;span class="s"&gt;"90"&lt;/span&gt;
           &lt;span class="na"&gt;PositionFactor=&lt;/span&gt;&lt;span class="s"&gt;"0.65"&lt;/span&gt;
           &lt;span class="na"&gt;VerticalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Start"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;gauge:GaugeAnnotation.Content&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;HorizontalStackLayout&lt;/span&gt; &lt;span class="na"&gt;BindingContext=&lt;/span&gt;&lt;span class="s"&gt;"{Binding}"&lt;/span&gt; &lt;span class="na"&gt;IsVisible=&lt;/span&gt;&lt;span class="s"&gt;"{Binding IsReminderTimeVisible}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
       &lt;span class="nt"&gt;&amp;lt;Image&lt;/span&gt; &lt;span class="na"&gt;Background=&lt;/span&gt;&lt;span class="s"&gt;"#E8E4FF"&lt;/span&gt; &lt;span class="na"&gt;Source=&lt;/span&gt;&lt;span class="s"&gt;"notification.png"&lt;/span&gt; &lt;span class="na"&gt;VerticalOptions=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt; &lt;span class="na"&gt;HeightRequest=&lt;/span&gt;&lt;span class="s"&gt;"30"&lt;/span&gt; &lt;span class="na"&gt;WidthRequest=&lt;/span&gt;&lt;span class="s"&gt;"30"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
       &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"{Binding TimerModel.ReminderTime}"&lt;/span&gt; &lt;span class="na"&gt;HorizontalOptions=&lt;/span&gt;&lt;span class="s"&gt;"Start"&lt;/span&gt; &lt;span class="na"&gt;VerticalOptions=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/HorizontalStackLayout&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;/gauge:GaugeAnnotation.Content&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/gauge:GaugeAnnotation&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/gauge:RadialAxis.Annotations&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/gauge:RadialAxis&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/gauge:SfRadialGauge.Axes&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/gauge:SfRadialGauge&amp;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://res.cloudinary.com/practicaldev/image/fetch/s--ezAsVLs_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Displaying-elapsed-time-and-reminder-text-in-the-.NET-MAUI-Radial-Gauge-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ezAsVLs_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Displaying-elapsed-time-and-reminder-text-in-the-.NET-MAUI-Radial-Gauge-2.png" alt="Displaying elapsed time and reminder text in the .NET MAUI Radial Gauge" width="401" height="551"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Displaying elapsed time and reminder text in the .NET MAUI Radial Gauge&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 8: Start the timer
&lt;/h3&gt;

&lt;p&gt;Once the time is selected in the &lt;strong&gt;Time Picker&lt;/strong&gt; control &lt;strong&gt;,&lt;/strong&gt;  the &lt;strong&gt;Start Timer&lt;/strong&gt; Button is enabled to &lt;a href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.maui.dispatching.idispatchertimer.start?view=net-maui-8.0" rel="noopener noreferrer"&gt;Start&lt;/a&gt; the &lt;a href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.maui.dispatching.idispatchertimer?view=net-maui-8.0" rel="noopener noreferrer"&gt;IDispatcherTimer&lt;/a&gt;, which executes the dispatcher queue to determine the elapsed time and Radial Gauge pointer value.  &lt;/p&gt;

&lt;p&gt;Refer to the following code example to design and add the &lt;strong&gt;Start Timer&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MainPage.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;Button&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Start Timer"&lt;/span&gt; &lt;span class="na"&gt;CornerRadius=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt; &lt;span class="na"&gt;HeightRequest=&lt;/span&gt;&lt;span class="s"&gt;"40"&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;"10,20,10,0"&lt;/span&gt; &lt;span class="na"&gt;VerticalOptions=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt; &lt;span class="na"&gt;IsEnabled=&lt;/span&gt;&lt;span class="s"&gt;"{Binding IsStartButtonEnabled}"&lt;/span&gt; &lt;span class="na"&gt;Command=&lt;/span&gt;&lt;span class="s"&gt;"{Binding StartButtonCommand}"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Refer to the following code example to &lt;strong&gt;Start&lt;/strong&gt; the &lt;strong&gt;IDispatcherTimer&lt;/strong&gt; and change the visibility of the .NET MAUI &lt;strong&gt;Time Picker&lt;/strong&gt; and &lt;strong&gt;Radial Gauge&lt;/strong&gt; based on the Time Picker’s selected time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TimerViewModel.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;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TimerViewModel&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;bool&lt;/span&gt; &lt;span class="n"&gt;isStartButtonEnabled&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;Command&lt;/span&gt; &lt;span class="n"&gt;StartButtonCommand&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;bool&lt;/span&gt; &lt;span class="n"&gt;IsStartButtonEnabled&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;isStartButtonEnabled&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isStartButtonEnabled&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="k"&gt;this&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;IsStartButtonEnabled&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;public&lt;/span&gt; &lt;span class="nf"&gt;TimerViewModel&lt;/span&gt;&lt;span class="p"&gt;()&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;StartButtonCommand&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;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OnStartButtonClick&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;IsStartButtonEnabled&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="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;OnStartButtonClick&lt;/span&gt;&lt;span class="p"&gt;()&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;TimerModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TimerPointerValue&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;100&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;IsReminderTimeVisible&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timerTick&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;TimerModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SelectedTime&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;TimerModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TimerTime&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;TimerModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SelectedTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@"hh\:mm\:ss"&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;ButtonText&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Pause"&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TimerModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SelectedTime&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;TimeSpan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Zero&lt;/span&gt;&lt;span class="p"&gt;)&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;PickerIsVisible&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RadialGaugeIsVisible&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;StartTimer&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;StartTimer&lt;/span&gt;&lt;span class="p"&gt;()&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;TimerModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReminderTime&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;Now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddSeconds&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;TimerModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SelectedTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TotalSeconds&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;ToShortTimeString&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsRunning&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;timer&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;Start&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;Refer to the following image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zusvxw2W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Adding-the-Start-Timer-button-in-the-.NET-MAUI-Timer-app-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zusvxw2W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Adding-the-Start-Timer-button-in-the-.NET-MAUI-Timer-app-2.png" alt="Adding the Start Timer button in the .NET MAUI Timer app" width="401" height="551"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Adding the Start Timer button in the .NET MAUI Timer app&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 9: Stop the timer
&lt;/h3&gt;

&lt;p&gt;Let’s design the &lt;strong&gt;Cancel&lt;/strong&gt; button to stop the timer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MainPage.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;Button&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Cancel"&lt;/span&gt; &lt;span class="na"&gt;CornerRadius=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt; &lt;span class="na"&gt;Background=&lt;/span&gt;&lt;span class="s"&gt;"#6750A4"&lt;/span&gt; &lt;span class="na"&gt;WidthRequest=&lt;/span&gt;&lt;span class="s"&gt;"85"&lt;/span&gt; &lt;span class="na"&gt;HeightRequest=&lt;/span&gt;&lt;span class="s"&gt;"40"&lt;/span&gt; &lt;span class="na"&gt;Command=&lt;/span&gt;&lt;span class="s"&gt;"{Binding CancelButtonCommand}"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, we need to set the value of the &lt;a href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.maui.dispatching.idispatchertimer?view=net-maui-8.0" rel="noopener noreferrer"&gt;IDispatcherTimer&lt;/a&gt; to &lt;a href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.maui.dispatching.idispatchertimer.stop?view=net-maui-8.0" rel="noopener noreferrer"&gt;Stop&lt;/a&gt; and reset the &lt;strong&gt;TimerModel&lt;/strong&gt; properties value to the default.&lt;/p&gt;

&lt;p&gt;Refer to the following code example to &lt;strong&gt;stop&lt;/strong&gt; the &lt;strong&gt;IDispatcherTimer&lt;/strong&gt; and change the visibility of the .NET MAUI &lt;strong&gt;Time Picker&lt;/strong&gt; and &lt;strong&gt;Radial Gauge&lt;/strong&gt; when clicking the &lt;strong&gt;Cancel&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TimerViewModel.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;public&lt;/span&gt; &lt;span class="n"&gt;Command&lt;/span&gt; &lt;span class="n"&gt;CancelButtonCommand&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="nf"&gt;TimerViewModel&lt;/span&gt;&lt;span class="p"&gt;()&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;CancelButtonCommand&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;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OnCancelButtonClick&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;OnCancelButtonClick&lt;/span&gt;&lt;span class="p"&gt;()&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;TimerModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SelectedTime&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;TimeSpan&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;PickerIsVisible&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RadialGaugeIsVisible&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TimerModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TimerPointerValue&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;100&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;TimerModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TimerTime&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;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timerTick&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;TimeSpan&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="nf"&gt;StopTimer&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;StopTimer&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsRunning&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;timer&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;Stop&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://res.cloudinary.com/practicaldev/image/fetch/s--11_7ArOg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Adding-the-Cancel-button-in-the-.NET-MAUI-Timer-app-4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--11_7ArOg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Adding-the-Cancel-button-in-the-.NET-MAUI-Timer-app-4.png" alt="Adding the Cancel button in the .NET MAUI Timer app" width="401" height="551"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Adding the Cancel button in the .NET MAUI Timer app&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 10: Pause or resume the timer
&lt;/h3&gt;

&lt;p&gt;Let’s design the &lt;strong&gt;Pause&lt;/strong&gt; or &lt;strong&gt;Resume&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MainPage.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;Button&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"{Binding ButtonText}"&lt;/span&gt; &lt;span class="na"&gt;Background=&lt;/span&gt;&lt;span class="s"&gt;"#6750A4"&lt;/span&gt; &lt;span class="na"&gt;WidthRequest=&lt;/span&gt;&lt;span class="s"&gt;"85"&lt;/span&gt; &lt;span class="na"&gt;HeightRe-quest=&lt;/span&gt;&lt;span class="s"&gt;"40"&lt;/span&gt; &lt;span class="na"&gt;Grid.Column=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;CornerRadius=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt; &lt;span class="na"&gt;Command=&lt;/span&gt;&lt;span class="s"&gt;"{Binding PauseButtonCommand}"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, we need to set the value as &lt;strong&gt;Stop&lt;/strong&gt; or &lt;strong&gt;Start&lt;/strong&gt; in the &lt;strong&gt;IDispatcherTimer&lt;/strong&gt; and the &lt;strong&gt;Reminder&lt;/strong&gt;  &lt;strong&gt;time&lt;/strong&gt; based on the &lt;strong&gt;Pause&lt;/strong&gt; or &lt;strong&gt;Resume&lt;/strong&gt; click action.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TimerViewModel.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;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TimerViewModel&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;public&lt;/span&gt; &lt;span class="n"&gt;Command&lt;/span&gt; &lt;span class="n"&gt;PauseButtonCommand&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="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;buttonText&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;ButtonText&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;buttonText&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;buttonText&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="k"&gt;this&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;ButtonText&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;public&lt;/span&gt; &lt;span class="nf"&gt;TimerViewModel&lt;/span&gt;&lt;span class="p"&gt;()&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;PauseButtonCommand&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;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OnPauseButtonClick&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;ButtonText&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Pause"&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;OnPauseButtonClick&lt;/span&gt;&lt;span class="p"&gt;()&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;TimerModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReminderTime&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;Now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddSeconds&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;timerTick&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TotalSeconds&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;ToShortTimeString&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ButtonText&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"Pause"&lt;/span&gt;&lt;span class="p"&gt;)&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="nf"&gt;StopTimer&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;ButtonText&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Resume"&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;IsReminderTimeVisible&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="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&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;ButtonText&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"Resume"&lt;/span&gt;&lt;span class="p"&gt;)&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="nf"&gt;StartTimer&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;ButtonText&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Pause"&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;IsReminderTimeVisible&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--B4wjsrCi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Pause-button-in-the-.NET-MAUI-timer-app-4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--B4wjsrCi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Pause-button-in-the-.NET-MAUI-timer-app-4.png" alt="Pause button in the .NET MAUI timer app" width="401" height="551"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pause button in the .NET MAUI timer app&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--talCvtYE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Resume-button-on-the-.NET-MAUI-timer-app.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--talCvtYE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Resume-button-on-the-.NET-MAUI-timer-app.png" alt="Resume button on the .NET MAUI timer app" width="401" height="551"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Resume button on the .NET MAUI timer app&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EMSeFa13--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Designing-a-Timer-app-using-.NET-MAUI-Radial-Gauge-and-Time-Picker-controls-6.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EMSeFa13--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Designing-a-Timer-app-using-.NET-MAUI-Radial-Gauge-and-Time-Picker-controls-6.gif" alt="Designing a Timer app using .NET MAUI Radial Gauge and Time Picker controls" width="510" height="753"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Designing a Timer app using .NET MAUI Radial Gauge and Time Picker controls&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub reference
&lt;/h2&gt;

&lt;p&gt;For more details, download the complete example of &lt;a href="https://github.com/SyncfusionExamples/Design-a-Timer-application-in-.NET-MAUI-using-Radial-Gauge" rel="noopener noreferrer"&gt;Designing a timer app using .NET MAUI Radial Gauge and Time Picker&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Thanks for reading! In this blog, we’ve learned how to design a timer app using the Syncfusion &lt;a href="https://www.syncfusion.com/maui-controls/maui-radial-gauge" rel="noopener noreferrer"&gt;.NET MAUI Radial Gauge&lt;/a&gt; and &lt;a href="https://www.syncfusion.com/maui-controls/maui-timepicker" rel="noopener noreferrer"&gt;Time Picker&lt;/a&gt; controls. Give it a try, and leave your feedback in the comment section below.&lt;/p&gt;

&lt;p&gt;For our customers, the latest version of Essential Studio is available from the &lt;a href="https://www.syncfusion.com/account/downloads" rel="noopener noreferrer"&gt;License and Downloads&lt;/a&gt; page. If you’re not a Syncfusion customer, try our 30-day &lt;a href="https://www.syncfusion.com/downloads" rel="noopener noreferrer"&gt;free trial&lt;/a&gt; to evaluate our components.&lt;/p&gt;

&lt;p&gt;You can also contact us through our &lt;a href="https://www.syncfusion.com/forums" rel="noopener noreferrer"&gt;support forum&lt;/a&gt;, &lt;a href="https://support.syncfusion.com/" rel="noopener noreferrer"&gt;support portal&lt;/a&gt;, or &lt;a href="https://www.syncfusion.com/feedback/maui" rel="noopener noreferrer"&gt;feedback portal&lt;/a&gt;. We are always happy to assist you!&lt;/p&gt;

&lt;h2&gt;
  
  
  Related blogs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/make-payment-easy-maui-radio-button" rel="noopener noreferrer"&gt;Making Payments Easy: Using .NET MAUI Radio Button for Payment Apps and Digital Wallets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/search-products-dotnet-maui-checkbox" rel="noopener noreferrer"&gt;Mastering Shopping: Enhancing Your Product Search with the .NET MAUI CheckBox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/zoom-view-pdf-in-callout-dotnet-maui" rel="noopener noreferrer"&gt;How to Zoom and View the Desired Area in a PDF using .NET MAUI PDF Viewer?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/new-built-in-toolbar-maui-pdf-viewer" rel="noopener noreferrer"&gt;Enhance PDF Viewing and Editing with the New Built-in Toolbar in .NET MAUI PDF Viewer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>dotnetmaui</category>
      <category>development</category>
      <category>maui</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Mastering Dynamic Editing in Flutter Charts</title>
      <dc:creator>Gayathri-github7</dc:creator>
      <pubDate>Tue, 30 Jul 2024 12:15:42 +0000</pubDate>
      <link>https://dev.to/syncfusion/mastering-dynamic-editing-in-flutter-charts-1k3a</link>
      <guid>https://dev.to/syncfusion/mastering-dynamic-editing-in-flutter-charts-1k3a</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Learn how to dynamically edit and update data in Syncfusion Flutter Charts, enabling real-time visualizations. This guide covers integrating Flutter Charts with the Flutter DataGrid for seamless data manipulation. Features include editing, sorting, and drag-and-drop data updates, all with interactive and fluid animations.&lt;/p&gt;

&lt;p&gt;The Syncfusion &lt;a href="https://www.syncfusion.com/flutter-widgets/flutter-charts" rel="noopener noreferrer"&gt;Flutter Charts&lt;/a&gt; include functionality for plotting 30+ charts. This widget lets you display live data that changes in seconds or minutes. It updates itself when the data changes or is added at run time. The dynamically updated data point values are rendered with fluid easing animation.&lt;/p&gt;

&lt;p&gt;In this blog, we’ll explore how to dynamically edit, sort, drag, and drop data in the Syncfusion Flutter Charts widget. Here, we will edit the data in the &lt;a href="https://www.syncfusion.com/flutter-widgets/flutter-datagrid" rel="noopener noreferrer"&gt;Flutter DataGrid&lt;/a&gt; widget and update the Flutter Charts accordingly. This feature lets users interactively edit or replace data points directly on the Charts, providing a more dynamic and intuitive data visualization experience.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pP9u7ubY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Dynamically-editing-and-updating-data-in-the-Syncfusion-Flutter-Chart-1.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pP9u7ubY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Dynamically-editing-and-updating-data-in-the-Syncfusion-Flutter-Chart-1.gif" alt="Dynamically editing and updating data in the Syncfusion Flutter Chart" width="800" height="494"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dynamically editing and updating data in the Syncfusion Flutter Chart&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;1. Dynamically editing Flutter Charts while editing the DataGrid&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Here, when you edit the data within the data grid, the changes are immediately reflected in the corresponding chart. This ensures that your visualizations are always current and accurately represent the latest data. Let’s see the steps to implement this real-time update functionality, with necessary code examples and configurations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting up the Flutter Charts
&lt;/h3&gt;

&lt;p&gt;Let’s configure the &lt;a href="https://help.syncfusion.com/flutter/cartesian-charts/getting-started" rel="noopener noreferrer"&gt;Flutter Charts&lt;/a&gt;, &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/SfCartesianChart/primaryXAxis.html" rel="noopener noreferrer"&gt;primaryXAxis&lt;/a&gt; and &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/SfCartesianChart/primaryYAxis.html" rel="noopener noreferrer"&gt;primaryYAxis&lt;/a&gt; to represent your data’s categories and numeric values, respectively. Here, we’ll use the Flutter &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/ColumnSeries-class.html" rel="noopener noreferrer"&gt;ColumnSeries&lt;/a&gt; to visualize employees’ data. This series fetches data from &lt;strong&gt;Employee&lt;/strong&gt; data source, mapping each employee’s name to the x-axis and their value to the y-axis.&lt;/p&gt;

&lt;p&gt;To further enhance the user experience, we’ll enable the series data labels using the &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/ChartSeries/dataLabelSettings.html" rel="noopener noreferrer"&gt;dataLabelSettings&lt;/a&gt;. This will provide immediate visual feedback, making it easier to understand the data points briefly.&lt;/p&gt;

&lt;p&gt;Moreover, the &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/CartesianSeries/onRendererCreated.html" rel="noopener noreferrer"&gt;onRendererCreated&lt;/a&gt; callback provides access to the chart’s series controller. This controller is a powerful tool that allows you to programmatically update and customize the chart, making chart data editing a breeze.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;SfCartesianChart _buildColumnChart() {
   return SfCartesianChart(
      primaryXAxis: const CategoryAxis(),
      primaryYAxis: const NumericAxis(),
      series: &lt;span class="nt"&gt;&amp;lt;ColumnSeries&amp;gt;&lt;/span&gt;[
        ColumnSeries&lt;span class="nt"&gt;&amp;lt;Employee&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="err"&gt;String&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;(
          dataSource: _source.employees,
          xValueMapper: (Employee employee, int index) =&amp;gt; employee.name,
          yValueMapper: (Employee employee, int index) =&amp;gt; employee.yValue,
          sortFieldValueMapper: (Employee employee, int index) =&amp;gt;
              _sortby == 'name' ? employee.name : employee.yValue,
          sortingOrder: _sortingOrder,
          dataLabelSettings: const DataLabelSettings(isVisible: true),
          onRendererCreated: (ChartSeriesController controller) {
            _controller = controller;
          },
        ),
      ],
   );
 }

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Setting up the Flutter DataGrid
&lt;/h3&gt;

&lt;p&gt;Next, we’ll use &lt;a href="https://help.syncfusion.com/flutter/datagrid/getting-started" rel="noopener noreferrer"&gt;Syncfusion’s Flutter DataGrid&lt;/a&gt; to create a powerful data management tool that not only displays employee information but also allows for seamless data editing.&lt;/p&gt;

&lt;p&gt;To achieve this, define the structure of the DataGrid, including column widths, data source, editing capabilities, navigation, and selection modes. Each column represents a different aspect of employee data, such as name and performance value, ensuring users can quickly identify and manage the necessary information.&lt;/p&gt;

&lt;p&gt;With the &lt;strong&gt;source&lt;/strong&gt; property, lay the foundation for your grid’s data by linking it to an instance of the &lt;strong&gt;EmployeeDataSource&lt;/strong&gt;. We can use the &lt;a href="https://pub.dev/documentation/syncfusion_flutter_datagrid/latest/datagrid/SfDataGrid/gridLinesVisibility.html" rel="noopener noreferrer"&gt;gridLinesVisibility&lt;/a&gt; property to make the grid lines visible for both rows and columns. With the &lt;a href="https://pub.dev/documentation/syncfusion_flutter_datagrid/latest/datagrid/SfDataGrid/headerGridLinesVisibility.html" rel="noopener noreferrer"&gt;headerGridLinesVisibility&lt;/a&gt; property, we can ensure that header grid lines are visible, providing a clear delineation between headers and data.&lt;/p&gt;

&lt;p&gt;By setting the &lt;a href="https://pub.dev/documentation/syncfusion_flutter_datagrid/latest/datagrid/SfDataGrid/allowEditing.html" rel="noopener noreferrer"&gt;allowEditing&lt;/a&gt; parameter to &lt;strong&gt;true&lt;/strong&gt;, you empower users to modify employee data directly within the grid. Whether updating performance scores or correcting typos in employee names, users have complete control over the data editing process.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;SfDataGrid _buildDataGrid() {
    const TextStyle textStyle = TextStyle(fontWeight: FontWeight.bold);
    return SfDataGrid(
      columnWidthMode: ColumnWidthMode.fill,
      source: _source,
      navigationMode: GridNavigationMode.cell,
      selectionMode: SelectionMode.single,
      gridLinesVisibility: GridLinesVisibility.both,
      headerGridLinesVisibility: GridLinesVisibility.both,
      allowEditing: true,      
      columns: &lt;span class="nt"&gt;&amp;lt;GridColumn&amp;gt;&lt;/span&gt;[
        GridColumn(
          columnName: 'name',
          label: Container(
            padding: const EdgeInsets.all(8.0),
            alignment: Alignment.center,
            child: const Text('Name',
                style: textStyle, overflow: TextOverflow.ellipsis),
          ),
        ),
        GridColumn(
          columnName: 'yValue',
          label: Container(
            padding: const EdgeInsets.all(8.0),
            alignment: Alignment.center,
            child: const Text('Value',
                style: textStyle, overflow: TextOverflow.ellipsis),
          ),
        ),
      ],
    );
}

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

&lt;/div&gt;



&lt;p&gt;The &lt;a href="https://pub.dev/documentation/syncfusion_flutter_datagrid/latest/datagrid/DataGridSource/buildEditWidget.html" rel="noopener noreferrer"&gt;buildEditWidget&lt;/a&gt; method serves as the gateway to data manipulation, providing a dynamic interface for entering and submitting changes.&lt;/p&gt;

&lt;p&gt;At its core, the &lt;a href="https://pub.dev/documentation/syncfusion_flutter_datagrid/latest/datagrid/DataGridSource/onCellSubmit.html" rel="noopener noreferrer"&gt;onCellSubmit&lt;/a&gt; method serves as the bridge between user edits and data persistence. When a user makes changes to a cell within the Flutter DataGrid, whether it’s updating an employee’s name or tweaking their performance score, the &lt;a href="https://pub.dev/documentation/syncfusion_flutter_datagrid/latest/datagrid/DataGridSource/onCellSubmit.html" rel="noopener noreferrer"&gt;onCellSubmit&lt;/a&gt; method springs into action, ensuring that these changes are reflected in the underlying data model.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;@override
Future&lt;span class="nt"&gt;&amp;lt;void&amp;gt;&lt;/span&gt; onCellSubmit(DataGridRow dataGridRow,
  RowColumnIndex rowColumnIndex, GridColumn column) async {
    final dynamic oldValue = dataGridRow
            .getCells()
            .firstWhereOrNull((DataGridCell dataGridCell) =&amp;gt;
                dataGridCell.columnName == column.columnName)
            ?.value ??
        '';

    final int dataRowIndex = _dataGridRows.indexOf(dataGridRow);

    if (newCellValue == null || oldValue == newCellValue) {
      return;
    }

    editedRowIndex = dataRowIndex;

    if (column.columnName == 'name') {
      _dataGridRows[dataRowIndex].getCells()[rowColumnIndex.columnIndex] =
          DataGridCell&lt;span class="nt"&gt;&amp;lt;String&amp;gt;&lt;/span&gt;(columnName: 'name', value: newCellValue);
      employees[dataRowIndex].name = newCellValue.toString();
    } else if (column.columnName == 'yValue') {
      num? yValue = newCellValue as num?;
      _dataGridRows[dataRowIndex].getCells()[rowColumnIndex.columnIndex] =
          DataGridCell&lt;span class="nt"&gt;&amp;lt;num&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;(columnName: 'yValue', value: yValue);
      employees[dataRowIndex].yValue = yValue;
    }
  }

  @override
  Widget? buildEditWidget(DataGridRow dataGridRow,
   RowColumnIndex rowColumnIndex, GridColumn column, CellSubmit submitCell) {
    final String displayText = dataGridRow
            .getCells()
            .firstWhereOrNull((DataGridCell dataGridCell) =&amp;gt;
                dataGridCell.columnName == column.columnName)
            ?.value
            ?.toString() ??
        '';

    newCellValue = null;
    final bool isNumericType = column.columnName == 'yValue';
    final RegExp regExp = _regExp(isNumericType, column.columnName);

    return Container(
      ….
        keyboardType: isNumericType ? TextInputType.number : TextInputType.text,
        onChanged: (String value) {
          if (value.isNotEmpty) {
            if (isNumericType) {
              newCellValue = double.parse(value);
            } else {
              newCellValue = value;
            }
          } else {
            newCellValue = null;
          }
        },
        onSubmitted: (String value) {
          submitCell();
        },
      ),
    );
  }

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Integrating Flutter DataGrid and Charts
&lt;/h3&gt;

&lt;p&gt;With each edit made within the Flutter DataGrid, you trigger a cascade of updates within the Flutter Charts widget, ensuring that visualizations reflect the latest changes in real time.&lt;/p&gt;

&lt;p&gt;When a user submits a cell edit within the DataGrid, the &lt;strong&gt;updateChart&lt;/strong&gt; function is called. This function serves as the bridge between the DataGrid and the Charts widgets, ensuring that any changes made in the DataGrid are propagated to the Charts to perform the chart data editing in real time.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;class EmployeeDataSource extends DataGridSource {
  EmployeeDataSource(this.employees, this._updateChartData) {
    ….
  }

  …..
  VoidCallback _updateChartData;


  @override
  Future&lt;span class="nt"&gt;&amp;lt;void&amp;gt;&lt;/span&gt; onCellSubmit(DataGridRow dataGridRow,
  RowColumnIndex rowColumnIndex, GridColumn column) async {

    …..

    _updateChartData.call();
  }
}
… 

void _updateDataSource() {
    _controller?.updateDataSource(updatedDataIndex: _source.editedRowIndex);
}

&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://res.cloudinary.com/practicaldev/image/fetch/s--pP9u7ubY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Dynamically-editing-and-updating-data-in-the-Syncfusion-Flutter-Chart-1.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pP9u7ubY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Dynamically-editing-and-updating-data-in-the-Syncfusion-Flutter-Chart-1.gif" alt="Dynamically editing and updating data in the Syncfusion Flutter Chart" width="800" height="494"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dynamically editing and updating data in the Syncfusion Flutter Chart&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Dynamically sorting the Flutter Charts data while sorting the DataGrid
&lt;/h2&gt;

&lt;p&gt;Sorting is a powerful tool for data analysis. Here, we are going to perform sorting on the Flutter DataGrid, which will automatically refresh and update the Charts data. This ensures that your chart reflects the most current data, significantly enhancing user experience.&lt;/p&gt;

&lt;p&gt;With this, users can organize and view their data from different perspectives without any manual updates.&lt;/p&gt;

&lt;p&gt;Let’s use the &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/ChartSeries/sortingOrder.html" rel="noopener noreferrer"&gt;sortingOrder&lt;/a&gt; and &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/ChartSeries/sortFieldValueMapper.html" rel="noopener noreferrer"&gt;sortFieldValueMapper&lt;/a&gt; properties to sort and update the chart data either by employee name or their performance value. When a column header is clicked, the sorting operation will be initiated. The &lt;a href="https://pub.dev/documentation/syncfusion_flutter_datagrid/latest/datagrid/DataGridSource/performSorting.html" rel="noopener noreferrer"&gt;performSorting&lt;/a&gt; method is called with the list of rows to be sorted and updates the chart data accordingly.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;class EmployeeDataSource extends DataGridSource {
  EmployeeDataSource(this.employees, this.buildContext, this.updateChart,
  this.updateChartSorting) {
    ….
  }

  …..
  VoidCallback updateChartSorting;
  String? sortedColumnName;
  DataGridSortingOrder sortDirection = DataGridSortingOrder.none;
  DataGridSortingOrder _previousSortDirection = DataGridSortingOrder.none;

  ….

  @override
  Future&lt;span class="nt"&gt;&amp;lt;void&amp;gt;&lt;/span&gt; performSorting(List&lt;span class="nt"&gt;&amp;lt;DataGridRow&amp;gt;&lt;/span&gt; rows) {
    if (sortedColumns.isNotEmpty) {
      sortedColumnName = sortedColumns[0].name;
      sortDirection =
          sortedColumns[0].sortDirection == DataGridSortDirection.ascending
              ? DataGridSortingOrder.ascending
              : DataGridSortingOrder.descending;
    } else {
      sortedColumnName = null;
      sortDirection = DataGridSortingOrder.none;
    }

    if (_previousSortDirection != sortDirection) {
      updateChartSorting.call();
      _previousSortDirection = sortDirection;
    }
    return super.performSorting(rows);
  }
}

void _updateDataSorting() {
  setState(
      () {
        _sortingOrder =
            _employeeDataSource.sortDirection == DataGridSortingOrder.ascending
                ? SortingOrder.ascending
                : _employeeDataSource.sortDirection ==
                        DataGridSortingOrder.descending
                    ? SortingOrder.descending
                    : SortingOrder.none;
        _sortby = _employeeDataSource.sortedColumnName.toString();
      },
  );
}

&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://res.cloudinary.com/practicaldev/image/fetch/s--ePnkyK1d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Dynamically-sorting-Flutter-Charts-data-while-sorting-the-DataGrid-1.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ePnkyK1d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Dynamically-sorting-Flutter-Charts-data-while-sorting-the-DataGrid-1.gif" alt="Dynamically sorting Flutter Charts data while sorting the DataGrid" width="800" height="494"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dynamically sorting Flutter Charts data while sorting the DataGrid&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Dynamically editing/replacing Flutter Charts data while dragging the data using touch methods
&lt;/h2&gt;

&lt;p&gt;Interactive data points allow users to manipulate the data displayed on the chart directly. By enabling touch methods, users can drag data points to new values and edit or replace chart data to reflect these changes. This interaction provides a hands-on approach to data analysis and makes the chart more engaging. We’ll demonstrate how to implement this feature, making your charts more responsive and user-friendly.&lt;/p&gt;

&lt;p&gt;Declare the &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/SfCartesianChart/onChartTouchInteractionMove.html" rel="noopener noreferrer"&gt;onChartTouchInteractionMove&lt;/a&gt; and &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/SfCartesianChart/onChartTouchInteractionUp.html" rel="noopener noreferrer"&gt;onChartTouchInteractionUp&lt;/a&gt; callbacks within the &lt;strong&gt;SfCartesianChart&lt;/strong&gt; widget. These callbacks become the cornerstone of user interaction, capturing touch events and laying the foundation for real-time chart updating. With touch events at your fingertips, you delve into the realm of interactivity. As users drag their fingers across the chart, harness the power of the &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/ChartSeriesController-class.html" rel="noopener noreferrer"&gt;ChartSeriesController&lt;/a&gt; and &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/CartesianSeries/onRendererCreated.html" rel="noopener noreferrer"&gt;onRendererCreated&lt;/a&gt; callback to convert touch event positions into data points. This transformation becomes the bridge between user input and data manipulation.&lt;/p&gt;

&lt;p&gt;With each touch event, users are granted the ability to drag and manipulate data points with ease. As they move their fingers across the chart, original data points are removed, and updated data points are inserted in their place. This seamless transition between old and new data points forms the backbone of real-time chart data editing and updating.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;int? pointIndex;
ChartSeriesController? _controller;

@override
Widget build(BuildContext context) {
  return Scaffold(
      body: SfCartesianChart(
        onChartTouchInteractionMove: (ChartTouchInteractionArgs tapArgs) {
          _updateDataPoint(tapArgs);
        },
        onChartTouchInteractionUp: (ChartTouchInteractionArgs tapArgs) {
          _updateDataPoint(tapArgs);
          pointIndex = null;
        },
        series: &lt;span class="nt"&gt;&amp;lt;CartesianSeries&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;ChartData,&lt;/span&gt; &lt;span class="err"&gt;num&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&amp;gt;[
          LineSeries&lt;span class="nt"&gt;&amp;lt;ChartData&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="err"&gt;num&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;(
            dataSource: chartData,
            xValueMapper: (ChartData data, int index) =&amp;gt; data.x,
            yValueMapper: (ChartData data, int index) =&amp;gt; data.y,
            markerSettings: const MarkerSettings(isVisible: true),
            onPointLongPress: (ChartPointDetails pointInteractionDetails) {
              pointIndex = pointInteractionDetails.pointIndex;
            },
            onRendererCreated: (ChartSeriesController controller) {
              _controller = controller;
            },
          ),
        ],
      ),
   );
}

void _updateDataPoint(ChartTouchInteractionArgs tapArgs) {
    if (pointIndex != null) {
      CartesianChartPoint&lt;span class="nt"&gt;&amp;lt;dynamic&amp;gt;&lt;/span&gt; dragPoint =
          _controller!.pixelToPoint(tapArgs.position);
      chartData.removeAt(pointIndex!);

      chartData.insert(
          chartData.length - 1, ChartData(dragPoint.x, dragPoint.y as double?));

      _controller!.updateDataSource(updatedDataIndex: pointIndex!);
    }
}

&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://res.cloudinary.com/practicaldev/image/fetch/s--rnzdHF4P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Dynamically-editingreplacing-Flutter-Charts-data-while-dragging-the-data-using-touch-methods-1.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rnzdHF4P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Dynamically-editingreplacing-Flutter-Charts-data-while-dragging-the-data-using-touch-methods-1.gif" alt="Dynamically editingreplacing Flutter Charts data while dragging the data using touch methods" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dynamically editingreplacing Flutter Charts data while dragging the data using touch methods&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Dynamically editing or replacing Flutter Charts data using the updateDataSource method
&lt;/h2&gt;

&lt;p&gt;Syncfusion’s tools make it easy to update the data source and have those changes reflected in the Flutter Charts. Whether you’re adding new data, deleting existing points, or modifying current values, the Charts widget will adjust accordingly. Here, we’ll guide you through the process of updating the data source, ensuring that your Charts remain accurate and up to date.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/ChartSeriesController/updateDataSource.html" rel="noopener noreferrer"&gt;updateDataSource&lt;/a&gt; method in the &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/ChartSeriesController-class.html" rel="noopener noreferrer"&gt;ChartSeriesController&lt;/a&gt; class efficiently updates the data source of a chart series without re-rendering the entire chart. This method is particularly useful when you need to modify, add, or remove data points dynamically in response to real-time chart or chart live updates or changes in data. The &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/ChartSeriesController/updateDataSource.html" rel="noopener noreferrer"&gt;updateDataSource&lt;/a&gt; method significantly improves performance by processing only the modified data points.&lt;/p&gt;

&lt;p&gt;Certainly! The &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/ChartSeriesController/updateDataSource.html" rel="noopener noreferrer"&gt;updateDataSource&lt;/a&gt; method provides flexibility in updating data points in bulk or individually, depending on the scenario. When you need to update a huge volume of data points at once, using the properties ending with &lt;strong&gt;Indexes&lt;/strong&gt; ( &lt;strong&gt;addedDataIndexes&lt;/strong&gt;, &lt;strong&gt;removedDataIndexes&lt;/strong&gt;, and &lt;strong&gt;updatedDataIndexes&lt;/strong&gt; ) is more efficient.  When you’re modifying only one or a few data points, it’s more convenient to use the properties ending with &lt;strong&gt;Index&lt;/strong&gt; ( &lt;strong&gt;addedDataIndex&lt;/strong&gt;, &lt;strong&gt;removedDataIndex&lt;/strong&gt;, and &lt;strong&gt;updatedDataIndex&lt;/strong&gt; ).&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;ChartSeriesController? _controller;

@override
Widget build(BuildContext context) {
   return Scaffold(
      body: Column(
        children: &lt;span class="nt"&gt;&amp;lt;Widget&amp;gt;&lt;/span&gt;[
          Expanded(
            child: SfCartesianChart(            
              series: &lt;span class="nt"&gt;&amp;lt;CartesianSeries&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;ChartData,&lt;/span&gt; &lt;span class="err"&gt;num&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&amp;gt;[
                LineSeries&lt;span class="nt"&gt;&amp;lt;ChartData&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="err"&gt;num&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;(
                 ….
                  onRendererCreated: (ChartSeriesController controller) {
                    _chartSeriesController = controller;
                  },
                ),
              ],
            ),
          ),
          TextButton(
            onPressed: () {
              // Update data
              chartData[1] = ChartData(2, 50);
              _controller!.updateDataSource(updatedDataIndex: 1);

              // Update datas
              chartData[1] = ChartData(2, 70);
              chartData[2] = ChartData(3, 80);
              chartData[3] = ChartData(4, 90);

              _chartSeriesController!
                  .updateDataSource(updatedDataIndexes: [1, 2, 3]);
            },
            child: const Text('Update Data'),
          ),
        ],
      ),
   );
}

&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://res.cloudinary.com/practicaldev/image/fetch/s--CDYy8sSJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Dynamically-Update-Flutter-Charts-data-using-the-updateDataSource-method.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CDYy8sSJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Dynamically-Update-Flutter-Charts-data-using-the-updateDataSource-method.gif" alt="Dynamically editing or replacing Flutter Charts data using the updateDataSource method" width="800" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dynamically editing or replacing Flutter Charts data using the updateDataSource method&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub reference
&lt;/h2&gt;

&lt;p&gt;For more details, refer to &lt;a href="https://github.com/SyncfusionExamples/Flutter-charts-dynamic-editing-sorting" rel="noopener noreferrer"&gt;dynamic editing in the Flutter Charts GitHub demo.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Thanks for reading! In this blog, we have seen how to dynamically edit data in the Syncfusion &lt;a href="https://www.syncfusion.com/flutter-widgets/flutter-charts" rel="noopener noreferrer"&gt;Flutter Charts&lt;/a&gt; widget with the help of DataGrid. Integrating these widgets allows you to create powerful real-time live update and chart sorting visualizations that update automatically based on user input. Also, we demonstrated how to enable efficient data updates and interactive data dragging in the Charts. By leveraging the &lt;strong&gt;updateDataSource&lt;/strong&gt; method, you can interactively modify, add, or remove data points without re-rendering the entire chart, thus enhancing the performance of your Flutter apps.&lt;/p&gt;

&lt;p&gt;Try the methods discussed in this blog, and leave your feedback in the comments below!&lt;/p&gt;

&lt;p&gt;For our customers, the latest version of Essential Studio is available from the &lt;a href="https://www.syncfusion.com/account/downloads" rel="noopener noreferrer"&gt;License and Downloads&lt;/a&gt; page. If you’re not a Syncfusion customer, try our 30-day &lt;a href="https://www.syncfusion.com/downloads" rel="noopener noreferrer"&gt;free trial&lt;/a&gt; to evaluate our components.&lt;/p&gt;

&lt;p&gt;If you have any questions, contact us through our &lt;a href="https://www.syncfusion.com/forums" rel="noopener noreferrer"&gt;support forum&lt;/a&gt;, &lt;a href="https://support.syncfusion.com/" rel="noopener noreferrer"&gt;support portal&lt;/a&gt;, or &lt;a href="https://www.syncfusion.com/feedback" rel="noopener noreferrer"&gt;feedback portal&lt;/a&gt;. As always, we are here to assist you!&lt;/p&gt;

&lt;h2&gt;
  
  
  Related blogs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/flutter-charts-series-customization" rel="noopener noreferrer"&gt;Spice Up Your Data Visualization with Flutter Charts Series Customization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/syncfusion-g2-badges-spring-2024" rel="noopener noreferrer"&gt;3 Easy Steps to Digitally Sign PDFs in Your Flutter App&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/synchronize-multiple-flutter-charts" rel="noopener noreferrer"&gt;Easily Synchronize Multiple Charts in Your Flutter App Like a Pro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/adding-scrollbar-in-flutter-charts" rel="noopener noreferrer"&gt;How to add a scrollbar to Syncfusion Flutter Charts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>flutter</category>
      <category>chart</category>
      <category>development</category>
      <category>desktop</category>
    </item>
    <item>
      <title>Easily Create Multi-Parent Hierarchical Trees with Blazor Diagram Component</title>
      <dc:creator>Gayathri-github7</dc:creator>
      <pubDate>Thu, 25 Jul 2024 13:34:39 +0000</pubDate>
      <link>https://dev.to/syncfusion/easily-create-multi-parent-hierarchical-trees-with-blazor-diagram-component-32e2</link>
      <guid>https://dev.to/syncfusion/easily-create-multi-parent-hierarchical-trees-with-blazor-diagram-component-32e2</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; The Syncfusion Blazor Diagram component is a powerful tool for creating interactive diagrams. Learn how to easily create a multi-parent hierarchical tree diagram, customize node spacing, adjust layouts, and utilize features like zoom, pan, expand/collapse, and export for a comprehensive visual experience.&lt;/p&gt;

&lt;p&gt;In the digital age, effectively visualizing complex relationships is crucial for any domain, from organizational structures to data science projects. Hierarchical trees with multiple parents, also known as &lt;a href="https://en.wikipedia.org/wiki/Directed_acyclic_graph" rel="noopener noreferrer"&gt;directed acyclic graphs (DAGs)&lt;/a&gt;, offer a powerful way to represent these intricate connections.&lt;/p&gt;

&lt;p&gt;In this blog, we’ll see how to create a hierarchical tree with multiple parents using the Syncfusion &lt;a href="https://www.syncfusion.com/blazor-components/blazor-diagram" rel="noopener noreferrer"&gt;Blazor Diagram&lt;/a&gt; component.&lt;/p&gt;

&lt;p&gt;Refer to the following image. Here, the rectangular boxes represent the nodes, and the curved lines represent the connectors.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--B_-Zi6gt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Creating-a-hierarchical-tree-with-multiple-parents-using-Blazor-Diagram-component.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--B_-Zi6gt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Creating-a-hierarchical-tree-with-multiple-parents-using-Blazor-Diagram-component.png" alt="Creating a hierarchical tree with multiple parents using Blazor Diagram component" width="800" height="646"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Creating a hierarchical tree with multiple parents using Blazor Diagram component&lt;/p&gt;

&lt;p&gt;Whether you’re a developer looking to streamline your workflow or a business analyst aiming to present data more intuitively, this guide will walk you through the step-by-step process to harness the versatile Blazor Diagram component’s full potential.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Creating a hierarchical tree diagram with multiple parents
&lt;/h2&gt;

&lt;p&gt;The Syncfusion Blazor Diagram component is designed to straightforwardly create &lt;a href="https://blazor.syncfusion.com/documentation/diagram/layout/complex-hierarchical-layout" rel="noopener noreferrer"&gt;hierarchical diagrams with multiple parents&lt;/a&gt;. It supports external data sources and can easily convert and map data into a visual diagram by setting a few properties.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuring the Blazor Diagram component
&lt;/h3&gt;

&lt;p&gt;Follow these steps to get started with the Blazor Diagram component:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First, refer to the &lt;a href="https://blazor.syncfusion.com/documentation/diagram/getting-started-with-web-app" rel="noopener noreferrer"&gt;Getting started with the Blazor Diagram library documentation&lt;/a&gt; to learn more about the dependent scripts and theme files required to integrate the Diagram component in a Blazor app.&lt;/li&gt;
&lt;li&gt;Define the tree information as a collection of data.&lt;/li&gt;
&lt;li&gt;Then, render the &lt;strong&gt;SfDiagramComponent&lt;/strong&gt; with the &lt;strong&gt;DataSourceSettings&lt;/strong&gt; class.&lt;/li&gt;
&lt;li&gt;Configure the data to the &lt;strong&gt;DataSource&lt;/strong&gt; property of the &lt;strong&gt;DataSourceSettings&lt;/strong&gt; class.&lt;/li&gt;
&lt;li&gt;Define the common formatting for all nodes and connectors through the &lt;strong&gt;NodeCreating&lt;/strong&gt; and *&lt;em&gt;ConnectorCreating *&lt;/em&gt; methods, respectively.&lt;/li&gt;
&lt;li&gt;After configuring the data source, define the &lt;strong&gt;layout type&lt;/strong&gt; as &lt;strong&gt;ComplexHierarchicalTree&lt;/strong&gt; to automatically arrange the nodes’ positions. Refer to the following code example or the &lt;a href="https://blazorplayground.syncfusion.com/VjhJZSWgpGHslFkt" rel="noopener noreferrer"&gt;Blazor Playground&lt;/a&gt; app.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;@using Syncfusion.Blazor.Diagram

&lt;span class="nt"&gt;&amp;lt;SfDiagramComponent&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;"@Diagram"&lt;/span&gt; &lt;span class="na"&gt;Created=&lt;/span&gt;&lt;span class="s"&gt;"OnCreated"&lt;/span&gt; &lt;span class="na"&gt;Height=&lt;/span&gt;&lt;span class="s"&gt;"690px"&lt;/span&gt; &lt;span class="na"&gt;NodeCreating=&lt;/span&gt;&lt;span class="s"&gt;"@OnNodeCreating"&lt;/span&gt; &lt;span class="na"&gt;ConnectorCreating=&lt;/span&gt;&lt;span class="s"&gt;"@OnConnectorCreating"&lt;/span&gt; &lt;span class="na"&gt;InteractionController=&lt;/span&gt;&lt;span class="s"&gt;"@DiagramInteractions.ZoomPan"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;DataSourceSettings&lt;/span&gt; &lt;span class="na"&gt;ID=&lt;/span&gt;&lt;span class="s"&gt;"Id"&lt;/span&gt; &lt;span class="na"&gt;ParentID=&lt;/span&gt;&lt;span class="s"&gt;"ReportingPerson"&lt;/span&gt; &lt;span class="na"&gt;DataSource=&lt;/span&gt;&lt;span class="s"&gt;"DataSource"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/DataSourceSettings&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Layout&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;bind-Type=&lt;/span&gt;&lt;span class="s"&gt;"@Type"&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;bind-VerticalSpacing=&lt;/span&gt;&lt;span class="s"&gt;"@VerticalSpacing"&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;bind-SamePoint=&lt;/span&gt;&lt;span class="s"&gt;"@samepoint"&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;bind-HorizontalSpacing=&lt;/span&gt;&lt;span class="s"&gt;"@HorizontalSpacing"&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;bind-Orientation=&lt;/span&gt;&lt;span class="s"&gt;"@OrientationType"&lt;/span&gt; &lt;span class="na"&gt;HorizontalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"@HorizontalAlignment"&lt;/span&gt; &lt;span class="na"&gt;VerticalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"@VerticalAlignment"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;LayoutMargin&lt;/span&gt; &lt;span class="na"&gt;Top=&lt;/span&gt;&lt;span class="s"&gt;"50"&lt;/span&gt; &lt;span class="na"&gt;Bottom=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;Right=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;Left=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/LayoutMargin&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Layout&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;SnapSettings&lt;/span&gt; &lt;span class="na"&gt;Constraints=&lt;/span&gt;&lt;span class="s"&gt;"SnapConstraints.None"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/SnapSettings&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/SfDiagramComponent&amp;gt;&lt;/span&gt;

@code
{
    private Orientation subTreeOrientation = Orientation.Vertical;
    private bool samepoint = false;
    private SubTreeAlignmentType subTreeAlignment = SubTreeAlignmentType.Right;

    public SfDiagramComponent Diagram;
    public LayoutOrientation OrientationType = LayoutOrientation.TopToBottom;
    public LayoutType Type = LayoutType.ComplexHierarchicalTree;
    public HorizontalAlignment HorizontalAlignment = HorizontalAlignment.Left;
    public VerticalAlignment VerticalAlignment = VerticalAlignment.Top;
    public int HorizontalSpacing = 40;
    public int VerticalSpacing = 40;


    // Defines default values for the Node object.
    private void OnNodeCreating(IDiagramObject obj)
    {
        Node node = obj as Node;
        node.Width = 40; node.Height = 40;
        //Initialize shape.
        HierarchicalDetails hierarchicalDetails = node.Data as HierarchicalDetails;
        node.Shape = new BasicShape() { Type =Syncfusion.Blazor.Diagram.NodeShapes.Basic, Shape = NodeBasicShapes.Rectangle, CornerRadius = 7 };
        node.Style = new ShapeStyle() { Fill = hierarchicalDetails.FilllColor, StrokeWidth = 1, StrokeColor = hierarchicalDetails.Border };
    }
    // Defines default values for the Connector object.
    private void OnConnectorCreating(IDiagramObject connector1)
    {
        Connector connector = (connector1 as Connector);
        connector.Type = ConnectorSegmentType.Orthogonal;
        connector.CornerRadius = 7;
        connector.Style = new ShapeStyle()
        {
            StrokeColor= "#6d6d6d",
        };
        connector.TargetDecorator.Height = 7;
        connector.TargetDecorator.Width = 7;
    }
    private void OnCreated()
    {
        FitOptions options = new FitOptions() { Mode = FitMode.Both, Region = DiagramRegion.Content };
        Diagram.FitToPage(options);
    }
    public class HierarchicalDetails
    {
        public string Id { get; set; }
        public string FilllColor { get; set; }
        public string Border { get; set; }
        public string Label { get; set; }
        public List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt; ReportingPerson { get; set; }
    }
    //DataSource items.
    public List&lt;span class="nt"&gt;&amp;lt;HierarchicalDetails&amp;gt;&lt;/span&gt; DataSource = new List&lt;span class="nt"&gt;&amp;lt;HierarchicalDetails&amp;gt;&lt;/span&gt;()
    {
        new HierarchicalDetails() { Id= "node11", Label = "StackPanel",FilllColor="#e7704c", Border="#c15433" },
        new HierarchicalDetails() { Id= "node12", Label= "StackPanel1", ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;(){ "node114" },FilllColor="#efd46e", Border="#d6b123" },
        new HierarchicalDetails() { Id= "node13", Label= "StackPanel2",ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;(){ "node12" },FilllColor="#58b087", Border="#16955e" },
        new HierarchicalDetails() { Id= "node14", Label= "StackPanel3",ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;(){ "node12"},FilllColor="#58b087", Border="#16955e" },
        new HierarchicalDetails() { Id= "node15", Label= "StackPanel4", ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;(){ "node12" },FilllColor="#58b087", Border="#16955e" },
        new HierarchicalDetails() { Id= "node116", Label= "StackPanel16",ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;(){ "node22", "node12"},FilllColor="#58b087", Border="#16955e" },
        new HierarchicalDetails() { Id= "node17", Label= "StackPanel6",ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;(){ "node13", "node14", "node15"},FilllColor="#659be5", Border="#3a6eb5"},
        new HierarchicalDetails() { Id= "node19", Label= "StackPanel8",ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;(){"node16", "node17", "node18" },FilllColor="#8dbe6c", Border="#489911"},
        new HierarchicalDetails() { Id= "node110", Label= "StackPanel9", ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;(){ "node16", "node17", "node18" },FilllColor="#8dbe6c", Border="#489911" },
        new HierarchicalDetails() { Id= "node111", Label= "StackPanel10",ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;(){"node16", "node17", "node18","node116" },FilllColor="#8dbe6c", Border="#489911"},
        new HierarchicalDetails() { Id= "node21", Label= "StackPanel11" ,FilllColor="#e7704c", Border="#c15433"},
        new HierarchicalDetails() { Id= "node22", Label= "StackPanel12",ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;(){"node114" },FilllColor="#efd46e", Border="#d6b123"},
        new HierarchicalDetails() { Id= "node23", Label= "StackPanel13", ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;(){ "node22" } ,FilllColor="#58b087", Border="#16955e"},
        new HierarchicalDetails() { Id= "node24", Label= "StackPanel14",ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;(){ "node22" },FilllColor="#58b087", Border="#16955e" },
        new HierarchicalDetails() { Id= "node25", Label= "StackPanel15",ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;(){"node22" },FilllColor="#58b087", Border="#16955e"},
        new HierarchicalDetails() { Id= "node27", Label= "StackPanel17",ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;(){"node23", "node24", "node25" },FilllColor="#659be5", Border="#3a6eb5"},
        new HierarchicalDetails() { Id= "node29", Label= "StackPanel19",ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;(){ "node26", "node27", "node28", "node116" } ,FilllColor="#8dbe6c", Border="#489911" },
        new HierarchicalDetails() { Id= "node210", Label= "StackPanel20",ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;(){"node26", "node27", "node28"} ,FilllColor="#8dbe6c", Border="#489911"},
        new HierarchicalDetails() { Id= "node211", Label= "StackPanel21",ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;(){ "node26", "node27", "node28" } ,FilllColor="#8dbe6c", Border="#489911" },
        new HierarchicalDetails() { Id= "node31", Label= "StackPanel22" ,FilllColor="#e7704c", Border="#c15433"},
        new HierarchicalDetails() { Id= "node114", Label= "StackPanel23", ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;(){ "node11", "node21", "node31" } ,FilllColor="#f3904a", Border="#d3722e" },

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Using nodes and connectors
&lt;/h3&gt;

&lt;p&gt;You can also construct a multi-parent hierarchical tree using a collection of nodes and connectors. This method gives you more control over your diagram’s individual elements.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;@using Syncfusion.Blazor.Diagram

&lt;span class="nt"&gt;&amp;lt;SfDiagramComponent&lt;/span&gt; &lt;span class="na"&gt;Height=&lt;/span&gt;&lt;span class="s"&gt;"600px"&lt;/span&gt; &lt;span class="na"&gt;Nodes=&lt;/span&gt;&lt;span class="s"&gt;"@nodes"&lt;/span&gt; &lt;span class="na"&gt;Connectors=&lt;/span&gt;&lt;span class="s"&gt;"@connectors"&lt;/span&gt; &lt;span class="na"&gt;NodeCreating=&lt;/span&gt;&lt;span class="s"&gt;"@OnNodeCreating"&lt;/span&gt; &lt;span class="na"&gt;ConnectorCreating=&lt;/span&gt;&lt;span class="s"&gt;"@OnConnectorCreating"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Layout&lt;/span&gt; &lt;span class="na"&gt;Type=&lt;/span&gt;&lt;span class="s"&gt;"LayoutType.ComplexHierarchicalTree"&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;bind-HorizontalSpacing=&lt;/span&gt;&lt;span class="s"&gt;"@HorizontalSpacing"&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;bind-VerticalSpacing=&lt;/span&gt;&lt;span class="s"&gt;"@VerticalSpacing"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Layout&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;SnapSettings&lt;/span&gt; &lt;span class="na"&gt;Constraints=&lt;/span&gt;&lt;span class="s"&gt;"SnapConstraints.None"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/SnapSettings&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/SfDiagramComponent&amp;gt;&lt;/span&gt;

@code
{
    //Initialize the diagram's nodes collection.
    DiagramObjectCollection&lt;span class="nt"&gt;&amp;lt;Node&amp;gt;&lt;/span&gt; nodes = new DiagramObjectCollection&lt;span class="nt"&gt;&amp;lt;Node&amp;gt;&lt;/span&gt;();
    //Initialize the diagram's connectors collection.
    DiagramObjectCollection&lt;span class="nt"&gt;&amp;lt;Connector&amp;gt;&lt;/span&gt; connectors = new DiagramObjectCollection&lt;span class="nt"&gt;&amp;lt;Connector&amp;gt;&lt;/span&gt;();
    int HorizontalSpacing = 40;
    int VerticalSpacing = 40;
    //Method to set node's default properties.
    private void OnNodeCreating(IDiagramObject obj)
    {
        Node node = obj as Node;
        node.Height = 40;
        node.Width = 50;
        //Initializing the default node's shape style.
        node.Style = new ShapeStyle() { Fill = "#6CA0DC", StrokeColor = "#6CA0DC" };
        node.Annotations = new DiagramObjectCollection&lt;span class="nt"&gt;&amp;lt;ShapeAnnotation&amp;gt;&lt;/span&gt;()
        {
            new ShapeAnnotation
            {
                Content = node.Annotations[0].Content,
                Style = new TextStyle() { Color = "white", Bold = true },
            }
        };
    }
    //Method to set connector's default properties.
    private void OnConnectorCreating(IDiagramObject connector)
    {
        (connector as Connector).Type = ConnectorSegmentType.Orthogonal;
        (connector as Connector).CornerRadius = 5;
        (connector as Connector).TargetDecorator = new DecoratorSettings() { Style = new ShapeStyle() { Fill = "#6CA0DC", StrokeColor = "#6CA0DC" } };
        (connector as Connector).Style = new ShapeStyle() { StrokeColor = "#6CA0DC" };

    }

    protected override void OnInitialized()
    {
        //Initializing node and connectors.
        nodes = new DiagramObjectCollection&lt;span class="nt"&gt;&amp;lt;Node&amp;gt;&lt;/span&gt;()
        {
            new Node() { ID="node1", Annotations = new DiagramObjectCollection&lt;span class="nt"&gt;&amp;lt;ShapeAnnotation&amp;gt;&lt;/span&gt;() { new ShapeAnnotation{Content="node1"} } },
            new Node() { ID="node2", Annotations = new DiagramObjectCollection&lt;span class="nt"&gt;&amp;lt;ShapeAnnotation&amp;gt;&lt;/span&gt;() { new ShapeAnnotation{Content="node2"} } },
            new Node() { ID="node3", Annotations = new DiagramObjectCollection&lt;span class="nt"&gt;&amp;lt;ShapeAnnotation&amp;gt;&lt;/span&gt;() { new ShapeAnnotation{Content="node3"} } },
            new Node() { ID="node4", Annotations = new DiagramObjectCollection&lt;span class="nt"&gt;&amp;lt;ShapeAnnotation&amp;gt;&lt;/span&gt;() { new ShapeAnnotation{Content="node4"} } },
            new Node() { ID="node5", Annotations = new DiagramObjectCollection&lt;span class="nt"&gt;&amp;lt;ShapeAnnotation&amp;gt;&lt;/span&gt;() { new ShapeAnnotation{Content="node5"} } },
        };
        connectors = new DiagramObjectCollection&lt;span class="nt"&gt;&amp;lt;Connector&amp;gt;&lt;/span&gt;()
        {
            new Connector() { ID="connector1", SourceID="node1", TargetID="node4" },
            new Connector() { ID="connector2", SourceID="node2", TargetID="node4" },
            new Connector() { ID="connector3", SourceID="node3", TargetID="node4" },
            new Connector() { ID="connector4", SourceID="node4", TargetID="node5" },
        };
    }
}
&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://res.cloudinary.com/practicaldev/image/fetch/s--u9a0QGlm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Creating-a-hierarchical-tree-with-multiple-parents-using-nodes-and-connectors.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--u9a0QGlm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Creating-a-hierarchical-tree-with-multiple-parents-using-nodes-and-connectors.png" alt="Creating a hierarchical tree with multiple parents using nodes and connectors" width="734" height="587"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Creating a hierarchical tree with multiple parents using nodes and connectors&lt;/p&gt;

&lt;h3&gt;
  
  
  Using dynamic and expando objects
&lt;/h3&gt;

&lt;p&gt;For even more flexibility, you can create a multi-parent layout using dynamic and expando objects. This approach lets you handle data that might change or expand over time without a pre-defined structure.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;@using Syncfusion.Blazor.Diagram
@using System.Text.Json;
@using System.Dynamic;

&lt;span class="nt"&gt;&amp;lt;SfDiagramComponent&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;"@diagram"&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;"100%"&lt;/span&gt; &lt;span class="na"&gt;Height=&lt;/span&gt;&lt;span class="s"&gt;"580px"&lt;/span&gt; &lt;span class="na"&gt;NodeCreating=&lt;/span&gt;&lt;span class="s"&gt;"NodeCreating"&lt;/span&gt; &lt;span class="na"&gt;ConnectorCreating=&lt;/span&gt;&lt;span class="s"&gt;"ConnectorCreating"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;DataSourceSettings&lt;/span&gt; &lt;span class="na"&gt;DataSource=&lt;/span&gt;&lt;span class="s"&gt;"@ExpandoDataSource"&lt;/span&gt; &lt;span class="na"&gt;ID=&lt;/span&gt;&lt;span class="s"&gt;"Id"&lt;/span&gt; &lt;span class="na"&gt;ParentID=&lt;/span&gt;&lt;span class="s"&gt;"ReportingPerson"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/DataSourceSettings&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Layout&lt;/span&gt; &lt;span class="na"&gt;Type=&lt;/span&gt;&lt;span class="s"&gt;"LayoutType.ComplexHierarchicalTree"&lt;/span&gt; &lt;span class="na"&gt;VerticalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"VerticalAlignment.Auto"&lt;/span&gt; &lt;span class="na"&gt;HorizontalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"HorizontalAlignment.Auto"&lt;/span&gt; &lt;span class="na"&gt;Orientation=&lt;/span&gt;&lt;span class="s"&gt;"LayoutOrientation.TopToBottom"&lt;/span&gt; &lt;span class="na"&gt;HorizontalSpacing=&lt;/span&gt;&lt;span class="s"&gt;"40"&lt;/span&gt; &lt;span class="na"&gt;VerticalSpacing=&lt;/span&gt;&lt;span class="s"&gt;"40"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Layout&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;SnapSettings&lt;/span&gt; &lt;span class="na"&gt;Constraints=&lt;/span&gt;&lt;span class="s"&gt;"SnapConstraints.None"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/SnapSettings&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/SfDiagramComponent&amp;gt;&lt;/span&gt;

@code {
    public SfDiagramComponent diagram;
    public List&lt;span class="nt"&gt;&amp;lt;ExpandoObject&amp;gt;&lt;/span&gt; ExpandoDataSource { get; set; }
    public List&lt;span class="nt"&gt;&amp;lt;ExpandoObject&amp;gt;&lt;/span&gt; ExpandoData = new List&lt;span class="nt"&gt;&amp;lt;ExpandoObject&amp;gt;&lt;/span&gt;();

    public class HierarchicalDetails
    {
        public string Id { get; set; }
        public string FilllColor { get; set; }
        public string Border { get; set; }
        public string Label { get; set; }
        public List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt; ReportingPerson { get; set; }
    }
    protected override void OnInitialized()
    {
        this.ExpandoDataSource = GetData();
    }

    public List&lt;span class="nt"&gt;&amp;lt;ExpandoObject&amp;gt;&lt;/span&gt; GetData()
    {
        ExpandoData.Clear();
        dynamic Member1 = new ExpandoObject();

        Member1.Id = "node11";
        Member1.Label = "StackPanel";
        Member1.FillColor = "#e7704c";
        Member1.Border = "#c15433";
        ExpandoData.Add(Member1);

        dynamic Member2 = new ExpandoObject();

        Member2.Id = "node12";
        Member2.Label = "StackPanel1";
        Member2.ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;() { "node114" };
        Member2.FillColor = "#efd46e";
        Member2.Border = "#d6b123";

        ExpandoData.Add(Member2);

        dynamic Member7 = new ExpandoObject();

        Member7.Id = "node13";
        Member7.Label = "StackPanel2";
        Member7.ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;() { "node12" };
        Member7.FillColor = "#58b087";
        Member7.Border = "#16955e";
        ExpandoData.Add(Member7);

        dynamic Member3 = new ExpandoObject();

        Member3.Id = "node14";
        Member3.Label = "StackPanel3";
        Member3.ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;() { "node12" };
        Member3.FillColor = "#58b087";
        Member3.Border = "#16955e";
        ExpandoData.Add(Member3);

        dynamic Member8 = new ExpandoObject();

        Member8.Id = "node15";
        Member8.Label = "StackPanel4";
        Member8.ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;() { "node12" };
        Member8.FillColor = "#58b087";
        Member8.Border = "#16955e";
        ExpandoData.Add(Member8);

        dynamic Member10 = new ExpandoObject();

        Member10.Id = "node116";
        Member10.Label = "StackPanel16";
        Member10.ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;() { "node22", "node12" };
        Member10.FillColor = "#58b087";
        Member10.Border = "#16955e";
        ExpandoData.Add(Member10);

        dynamic Member11 = new ExpandoObject();

        Member11.Id = "node17";
        Member11.Label = "StackPanel6";
        Member11.ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;() { "node13", "node14", "node15" };
        Member11.FillColor = "#659be5";
        Member11.Border = "#3a6eb5";
        ExpandoData.Add(Member11);

        dynamic Member13 = new ExpandoObject();

        Member13.Id = "node19";
        Member13.Label = "StackPanel8";
        Member13.ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;() { "node16", "node17", "node18" };
        Member13.FillColor = "#8dbe6c";
        Member13.Border = "#489911";
        ExpandoData.Add(Member13);

        dynamic Member5 = new ExpandoObject();

        Member5.Id = "node110";
        Member5.Label = "StackPanel9";
        Member5.ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;() { "node16", "node17", "node18" };
        Member5.FillColor = "#8dbe6c";
        Member5.Border = "#489911";
        ExpandoData.Add(Member5);

        dynamic Member14 = new ExpandoObject();

        Member14.Id = "node111";
        Member14.Label = "StackPanel10";
        Member14.ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;() { "node16", "node17", "node18", "node116" };
        Member14.FillColor = "#8dbe6c";
        Member14.Border = "#489911";
        ExpandoData.Add(Member14);

        dynamic Member15 = new ExpandoObject();

        Member15.Id = "node21";
        Member15.Label = "StackPanel11";
        Member15.FillColor = "#e7704c";
        Member15.Border = "#c15433";
        ExpandoData.Add(Member15);

        dynamic Member6 = new ExpandoObject();

        Member6.Id = "node22";
        Member6.Label = "StackPanel12";
        Member6.ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;() { "node114" };
        Member6.FillColor = "#efd46e";
        Member6.Border = "#d6b123";
        ExpandoData.Add(Member6);

        dynamic Member16 = new ExpandoObject();

        Member16.Id = "node23";
        Member16.Label = "StackPanel13";
        Member16.ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;() { "node22" };
        Member16.FillColor = "#58b087";
        Member16.Border = "#16955e";
        ExpandoData.Add(Member16);

        dynamic Member17 = new ExpandoObject();

        Member17.Id = "node24";
        Member17.Label = "StackPanel14";
        Member17.ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;() { "node22" };
        Member17.FillColor = "#58b087";
        Member17.Border = "#16955e";
        ExpandoData.Add(Member17);

        dynamic Member18 = new ExpandoObject();

        Member18.Id = "node25";
        Member18.Label = "StackPanel15";
        Member18.ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;() { "node22" };
        Member18.FillColor = "#58b087";
        Member18.Border = "#16955e";
        ExpandoData.Add(Member18);

        dynamic Member20 = new ExpandoObject();

        Member20.Id = "node27";
        Member20.Label = "StackPanel17";
        Member20.ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;() { "node23", "node24", "node25" };
        Member20.FillColor = "#659be5";
        Member20.Border = "#3a6eb5";
        ExpandoData.Add(Member20);

        dynamic Member22 = new ExpandoObject();

        Member22.Id = "node29";
        Member22.Label = "StackPanel19";
        Member22.ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;() { "node26", "node27", "node28", "node116" };
        Member22.FillColor = "#8dbe6c";
        Member22.Border = "#489911";
        ExpandoData.Add(Member22);

        dynamic Member23 = new ExpandoObject();

        Member23.Id = "node210";
        Member23.Label = "StackPanel20";
        Member23.ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;() { "node26", "node27", "node28" };
        Member23.FillColor = "#8dbe6c";
        Member23.Border = "#489911";
        ExpandoData.Add(Member23);

        dynamic Member24 = new ExpandoObject();

        Member24.Id = "node211";
        Member24.Label = "StackPanel21";
        Member24.ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;() { "node26", "node27", "node28" };
        Member24.FillColor = "#8dbe6c";
        Member24.Border = "#489911";
        ExpandoData.Add(Member24);

        dynamic Member25 = new ExpandoObject();

        Member25.Id = "node31";
        Member25.Label = "StackPanel22";
        Member25.FillColor = "#e7704c";
        Member25.Border = "#c15433";
        ExpandoData.Add(Member25);

        dynamic Member26 = new ExpandoObject();

        Member26.Id = "node114";
        Member26.Label = "StackPanel23";
        Member26.ReportingPerson = new List&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;() { "node11", "node21", "node31" };
        Member26.FillColor = "#f3904a";
        Member26.Border = "#d3722e";
        ExpandoData.Add(Member26);

        return ExpandoData;
    }

    private void NodeCreating(IDiagramObject obj)
    {
        Node node = obj as Node;
        node.Width = 40;
        node.Height = 40;
        node.Shape = new BasicShape() { Type = NodeShapes.Basic, Shape = NodeBasicShapes.Rectangle, CornerRadius = 7 };
        dynamic hierarchicalData = node.Data as ExpandoObject;
        if (hierarchicalData == null)
            hierarchicalData = JsonSerializer.Deserialize&lt;span class="nt"&gt;&amp;lt;ExpandoObject&amp;gt;&lt;/span&gt;(node.Data.ToString());
        node.Style.Fill = hierarchicalData.Border;
        node.Style.StrokeWidth = 1;
    }
    private void ConnectorCreating(IDiagramObject connector)
    {
        (connector as Connector).Type = ConnectorSegmentType.Orthogonal;
        (connector as Connector).CornerRadius = 7;
        (connector as Connector).TargetDecorator.Height = 7;
        (connector as Connector).TargetDecorator.Width = 7;
        (connector as Connector).TargetDecorator.Style.StrokeColor = "#6d6d6d";
    }
}
&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://res.cloudinary.com/practicaldev/image/fetch/s--SCDjI_Ul--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Creating-a-hierarchical-tree-with-multiple-diagrams-using-dynamic-and-expando-objects.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SCDjI_Ul--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Creating-a-hierarchical-tree-with-multiple-diagrams-using-dynamic-and-expando-objects.png" alt="Creating a hierarchical tree with multiple diagrams using dynamic and expando objects" width="800" height="726"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Creating a hierarchical tree with multiple diagrams using dynamic and expando objects&lt;/p&gt;

&lt;h3&gt;
  
  
  Customizing connector origins for clear diagrams
&lt;/h3&gt;

&lt;p&gt;In the automatic layout, line distribution is crucial for arranging connectors without overlap. Connectors originating from the same parent node can sometimes overlap, making the diagram unclear.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;SamePoint&lt;/strong&gt; property in the layout settings allows you to control whether the connectors from a single parent node should start from the same or different points. By default, the &lt;strong&gt;SamePoint&lt;/strong&gt; property is set to &lt;strong&gt;true&lt;/strong&gt;, ensuring a clean and organized diagram.&lt;/p&gt;

&lt;p&gt;The following code example illustrates creating a complex hierarchical tree with line distribution.&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;Layout&lt;/span&gt; &lt;span class="na"&gt;Type=&lt;/span&gt;&lt;span class="s"&gt;"LayoutType.ComplexHierarchicalTree"&lt;/span&gt; &lt;span class="na"&gt;SamePoint=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;bind-HorizontalSpacing=&lt;/span&gt;&lt;span class="s"&gt;"@HorizontalSpacing"&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;bind-VerticalSpacing=&lt;/span&gt;&lt;span class="s"&gt;"@VerticalSpacing"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Layout&amp;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://res.cloudinary.com/practicaldev/image/fetch/s--uk4sG8Ed--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Creating-a-complex-hierarchical-tree-with-line-distribution.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uk4sG8Ed--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Creating-a-complex-hierarchical-tree-with-line-distribution.png" alt="Creating a complex hierarchical tree with line distribution" width="800" height="682"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Creating a complex hierarchical tree with line distribution&lt;/p&gt;

&lt;h2&gt;
  
  
  Expand and collapse child nodes
&lt;/h2&gt;

&lt;p&gt;You can use the &lt;strong&gt;ExpandIcon&lt;/strong&gt; and &lt;strong&gt;CollapseIcon&lt;/strong&gt; properties of nodes to implement the expand and collapse features in the hierarchical tree’s children nodes. &lt;/p&gt;

&lt;p&gt;Refer to the following code example or the &lt;a href="https://blazorplayground.syncfusion.com/hZLzDoszsHWEtPwK" rel="noopener noreferrer"&gt;Blazor Playground&lt;/a&gt; app.&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;OnNodeCreating&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IDiagramObject&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Node&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ExpandIcon&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;DiagramExpandIcon&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Shape&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DiagramExpandIcons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Minus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Height&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Width&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Fill&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Gray"&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CollapseIcon&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;DiagramCollapseIcon&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Shape&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DiagramCollapseIcons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Plus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Height&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Width&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Fill&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Gray"&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://res.cloudinary.com/practicaldev/image/fetch/s--ZhgyI9o6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Expanding-and-collapsing-nodes-in-hierarchical-tree-diagram-with-multiple-parents-2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZhgyI9o6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Expanding-and-collapsing-nodes-in-hierarchical-tree-diagram-with-multiple-parents-2.gif" alt="Expanding and collapsing nodes in hierarchical tree diagram with multiple parents" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Expanding and collapsing nodes in hierarchical tree diagram with multiple parents&lt;/p&gt;

&lt;h2&gt;
  
  
  Drag-and-drop nodes
&lt;/h2&gt;

&lt;p&gt;You can easily change the multi-parent tree layout by dragging a parent or child node and dropping it in the required location. To enable editing of the hierarchical tree structure, add the following code to the Blazor Diagram component’s drop event. The demo is also available on the &lt;a href="https://blazorplayground.syncfusion.com/LNrfteCfLGwXCWHy" rel="noopener noreferrer"&gt;Blazor Playground app&lt;/a&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;async&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Drop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DropEventArgs&lt;/span&gt; &lt;span class="n"&gt;args&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;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Element&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;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Element&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;DiagramSelectionSettings&lt;/span&gt; &lt;span class="n"&gt;diagramSelectionSettings&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;diagramSelectionSettings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Nodes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Target&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;Node&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;diagramSelectionSettings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Nodes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&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;edges&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;InEdges&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;Connector&lt;/span&gt; &lt;span class="n"&gt;connector&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Diagram&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;edges&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;Connector&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;connector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SourceID&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Target&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;Node&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;await&lt;/span&gt; &lt;span class="n"&gt;Diagram&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DoLayout&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;Refer to the following image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--H4YVhbk7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Dragging-and-dropping-nodes-in-the-Blazor-multi-parent-hierarchical-tree-diagram.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--H4YVhbk7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Dragging-and-dropping-nodes-in-the-Blazor-multi-parent-hierarchical-tree-diagram.gif" alt="Dragging and dropping nodes in the Blazor multi-parent hierarchical tree diagram" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dragging and dropping nodes in the Blazor multi-parent hierarchical tree diagram&lt;/p&gt;

&lt;h2&gt;
  
  
  Spacing
&lt;/h2&gt;

&lt;p&gt;We can adjust the spacing between each level of the multi-parent tree diagram horizontally and vertically. Also, define a margin around the diagram.&lt;/p&gt;

&lt;p&gt;Refer to the following code example or the &lt;a href="https://blazorplayground.syncfusion.com/hXBTDIspAtNLGufy" rel="noopener noreferrer"&gt;Blazor Playground app&lt;/a&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;Layout&lt;/span&gt; &lt;span class="na"&gt;Type=&lt;/span&gt;&lt;span class="s"&gt;"LayoutType.ComplexHierarchicalTree"&lt;/span&gt; &lt;span class="na"&gt;VerticalSpacing=&lt;/span&gt;&lt;span class="s"&gt;"70"&lt;/span&gt; &lt;span class="na"&gt;HorizontalSpacing=&lt;/span&gt;&lt;span class="s"&gt;"70"&lt;/span&gt; &lt;span class="na"&gt;Orientation=&lt;/span&gt;&lt;span class="s"&gt;"LayoutOrientation.TopToBottom"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;LayoutMargin&lt;/span&gt; &lt;span class="na"&gt;Top=&lt;/span&gt;&lt;span class="s"&gt;"50"&lt;/span&gt; &lt;span class="na"&gt;Bottom=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;Right=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;Left=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/LayoutMargin&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Layout&amp;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://res.cloudinary.com/practicaldev/image/fetch/s--vX3R8j6p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Adjusting-the-spacing-between-the-nodes-in-the-Blazor-multi-parent-hierarchical-tree-diagram.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vX3R8j6p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Adjusting-the-spacing-between-the-nodes-in-the-Blazor-multi-parent-hierarchical-tree-diagram.png" alt="Adjusting the spacing between the nodes in the Blazor multi-parent hierarchical tree diagram" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Adjusting the spacing between the nodes in the Blazor multi-parent hierarchical tree diagram&lt;/p&gt;

&lt;h2&gt;
  
  
  Zooming and panning
&lt;/h2&gt;

&lt;p&gt;Viewing a large diagram on a small screen can be challenging. In that case, we can use the zooming and panning features to view the multi-parent tree in detail.&lt;/p&gt;

&lt;p&gt;You can zoom in and out of the diagram using the &lt;strong&gt;Ctrl + mouse wheel&lt;/strong&gt;. Refer to the following code example to enable zooming and panning actions in the Diagram component. Also, refer to the demo on the &lt;a href="https://blazorplayground.syncfusion.com/rtBTDoiJgNNuNQQS" rel="noopener noreferrer"&gt;Blazor Playground&lt;/a&gt; app.&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;SfDiagramComponent&lt;/span&gt; &lt;span class="na"&gt;ID=&lt;/span&gt;&lt;span class="s"&gt;"Diagram"&lt;/span&gt; &lt;span class="na"&gt;Height=&lt;/span&gt;&lt;span class="s"&gt;"700px"&lt;/span&gt; &lt;span class="na"&gt;InteractionController=&lt;/span&gt;&lt;span class="s"&gt;"DiagramInteractions.ZoomPan"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/SfDiagramComponent&amp;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://res.cloudinary.com/practicaldev/image/fetch/s--n-Jn1CBv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Zooming-and-panning-in-the-Blazor-multi-parent-hierarchical-tree-diagram.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--n-Jn1CBv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Zooming-and-panning-in-the-Blazor-multi-parent-hierarchical-tree-diagram.gif" alt="Zooming and panning in the Blazor multi-parent hierarchical tree diagram" width="600" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Zooming and panning in the Blazor multi-parent hierarchical tree diagram&lt;/p&gt;

&lt;h2&gt;
  
  
  Exporting
&lt;/h2&gt;

&lt;p&gt;We can also export the diagram to different image formats, such as PNG, JPEG, and SVG. Refer to the following code example or the &lt;a href="https://blazorplayground.syncfusion.com/rtLJDyWTLHdEnpmr" rel="noopener noreferrer"&gt;Blazor Playground&lt;/a&gt; app.&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;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;ExportDiagram&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;DiagramExportSettings&lt;/span&gt; &lt;span class="n"&gt;options&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;DiagramExportSettings&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Region&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DiagramPrintExportRegion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PageSettings&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;FitToPage&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="n"&gt;Margin&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;DiagramThickness&lt;/span&gt;&lt;span class="p"&gt;()&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;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Left&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Right&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Top&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="n"&gt;DiagramExportFormat&lt;/span&gt; &lt;span class="n"&gt;format&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DiagramExportFormat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JPEG&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;fileName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Diagram"&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;Diagram&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ExportAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;format&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Thanks for reading! In this blog, we have explored the process of creating and customizing a multi-parent hierarchical tree diagram using the Syncfusion &lt;a href="https://www.syncfusion.com/blazor-components/blazor-diagram" rel="noopener noreferrer"&gt;Blazor Diagram component&lt;/a&gt;. Give it a try, and leave your feedback in the comments section given below!&lt;/p&gt;

&lt;p&gt;Existing customers can download the latest version of Essential Studio on the &lt;a href="https://www.syncfusion.com/account" rel="noopener noreferrer"&gt;license and downloads&lt;/a&gt; page. If you are not a Syncfusion customer, try our 30-day &lt;a href="https://www.syncfusion.com/downloads" rel="noopener noreferrer"&gt;free trial&lt;/a&gt; (No credit card required) to experience our incredible features. &lt;/p&gt;

&lt;p&gt;You can also contact us through our &lt;a href="https://www.syncfusion.com/forums" rel="noopener noreferrer"&gt;support forum&lt;/a&gt;, &lt;a href="https://support.syncfusion.com/" rel="noopener noreferrer"&gt;support portal&lt;/a&gt;, or &lt;a href="https://www.syncfusion.com/feedback" rel="noopener noreferrer"&gt;feedback portal&lt;/a&gt;. As always, we are happy to assist you!&lt;/p&gt;

&lt;h2&gt;
  
  
  Related blogs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/line-routing-blazor-diagram-library" rel="noopener noreferrer"&gt;Boost Your Diagram Clarity with Line Routing in Blazor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/blazor-swimlane-diagrams" rel="noopener noreferrer"&gt;Syncfusion Blazor Diagram Library Now Supports Swimlane Diagrams&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/blazor-floor-planner-diagram" rel="noopener noreferrer"&gt;Create Interactive Floor Planner Diagrams using Blazor Diagram Library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/digital-logic-circuits-with-blazor-diagram-component" rel="noopener noreferrer"&gt;Crafting Interactive Digital Logic Circuits Made Easy with Blazor Diagram Component&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>blazor</category>
      <category>development</category>
      <category>ui</category>
      <category>web</category>
    </item>
    <item>
      <title>Chart of the Week: Creating a WPF Chart Dashboard to Analyze 2024 T20 World Cup Statistics</title>
      <dc:creator>Gayathri-github7</dc:creator>
      <pubDate>Wed, 24 Jul 2024 13:23:44 +0000</pubDate>
      <link>https://dev.to/syncfusion/chart-of-the-week-creating-a-wpf-chart-dashboard-to-analyze-2024-t20-world-cup-statistics-15n7</link>
      <guid>https://dev.to/syncfusion/chart-of-the-week-creating-a-wpf-chart-dashboard-to-analyze-2024-t20-world-cup-statistics-15n7</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Let’s create a WPF Chart dashboard to visualize 2024 T20 World Cup stats. Learn to gather data, define classes, and arrange elements for interactivity. Customize charts and ComboBox selections for an engaging analysis of cricket statistics.&lt;/p&gt;

&lt;p&gt;Welcome to the Chart of the Week blog series!&lt;/p&gt;

&lt;p&gt;Interpreting raw data can be tedious and challenging. However, visual representations such as charts and graphs make this process significantly easier and more intuitive. When these visual tools are enhanced with interactive features, understanding complex data becomes a piece of cake.&lt;/p&gt;

&lt;p&gt;We all recently enjoyed the thrilling matches of the T20 World Cup. Cricket brings out a mix of emotions—joy, grace, and sometimes sadness—creating unforgettable moments for players and fans alike. Everyone has their own favorite teams and players, and opinions vary widely.&lt;/p&gt;

&lt;p&gt;In this blog, we’ll show you how to create a rich dashboard to visualize the 2024 T20 World Cup data using the &lt;a href="https://www.syncfusion.com/wpf-controls/charts" rel="noopener noreferrer"&gt;Syncfusion WPF Charts&lt;/a&gt;. Unlike typical applications, a dashboard transforms raw data into visually appealing and easily understandable formats. We will specifically focus on visualizing country- wise T20 data using a combo box selection for an interactive experience.&lt;/p&gt;

&lt;p&gt;The following chart visually presents the discussed data, clearly comparing the 2024 T20 World Cup data, allowing you to gain insights briefly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VEo6jZg0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Visualizing-the-2024-T20-World-Cup-data-using-the-Syncfusion-WPF-Column-Chart.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VEo6jZg0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Visualizing-the-2024-T20-World-Cup-data-using-the-Syncfusion-WPF-Column-Chart.jpg" alt="Visualizing the 2024 T20 World Cup data using the Syncfusion WPF Column Chart" width="800" height="396"&gt;&lt;/a&gt;Here, we will visualize the runs scored by the 2024 T20 World Cup tournament players. Let’s explore the steps involved in showcasing these details using the &lt;a href="https://www.syncfusion.com/wpf-controls/charts/wpf-column-chart" rel="noopener noreferrer"&gt;Syncfusion WPF Column Chart&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Gathering the T20 data
&lt;/h2&gt;

&lt;p&gt;Before creating the chart dashboard, we need to gather data on the 2024 T20 World Cup from &lt;a href="https://www.espncricinfo.com/records/tournament/icc-men-s-t20-world-cup-2024-15946" rel="noopener noreferrer"&gt;ESPN Sports Media Ltd&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Populating the data
&lt;/h2&gt;

&lt;p&gt;To effectively manage and visualize cricket statistics, we’ll define two classes: &lt;strong&gt;PlayersData&lt;/strong&gt; and &lt;strong&gt;CountryData&lt;/strong&gt;. These classes will hold the necessary properties to represent individual player statistics and country-wide performance data, respectively.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PlayersData class properties&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name:&lt;/strong&gt; Represents the individual player’s name.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Score:&lt;/strong&gt; Stores the run values of the individual player.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;CountryData class properties&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Play:&lt;/strong&gt; Stores the overall count of matches played by each country.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wins:&lt;/strong&gt; Represents the count of matches won by each country.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runs:&lt;/strong&gt; Stores the run values scored by players by countries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CatchValue:&lt;/strong&gt; Demonstrates the number of catches taken by the team.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Score6s:&lt;/strong&gt; Represents the count of sixes scored by the team.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Score4s:&lt;/strong&gt; Represents the count of fours scored by the team.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Boundaries:&lt;/strong&gt; Represents the runs scored by the team through boundaries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batter:&lt;/strong&gt; Represents the top run count data from the team on a country-wise basis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BatterImage:&lt;/strong&gt; Stores the image of the best batter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WicketTaker:&lt;/strong&gt; Represents the top wicket count from the team on a country-wise basis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WicketTakerImage:&lt;/strong&gt; Stores the image of the best wicket-taker.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These classes will provide a structured way to manage and visualize cricket statistics, enabling us to create rich and interactive charting applications.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&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;PlayersData&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="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="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;Score&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="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CountryData&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;Play&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;Wins&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="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;Runs&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;CatchValue&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;Score6s&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;Score4s&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;Boundaries&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;Batter&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="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;BatterImage&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;WicketTaker&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="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;WicketTakerImage&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;Next, the data collection will be generated using the &lt;strong&gt;T20_Data&lt;/strong&gt; class, which has the following properties that demonstrate the details of a T20 match.&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;T20_Data&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;play&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;Play&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;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;play&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;play&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="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="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;wins&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;Wins&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;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;wins&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;wins&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="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="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;runs&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;Runs&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;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;runs&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;runs&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="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="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;catchValue&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;CatchValue&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;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;catchValue&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;catchValue&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="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="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;score6s&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;Score6s&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;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;score6s&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;score6s&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="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="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;score4s&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;Score4s&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;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;score4s&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;score4s&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="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="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;boundaries&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;Boundaries&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;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;boundaries&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;boundaries&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="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="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;batter&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;Batter&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;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;batter&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;batter&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="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="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;batterImage&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;BatterImage&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;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;batterImage&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;batterImage&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="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="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;wicketTaker&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;WicketTaker&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;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;wicketTaker&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;wicketTaker&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="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="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;wicketTakerImage&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;WicketTakerImage&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;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;wicketTakerImage&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;wicketTakerImage&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="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="n"&gt;ObservableCollection&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PlayersData&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;data&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;PlayersData&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Data&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;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;data&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;data&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="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="n"&gt;Dictionary&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;,&lt;/span&gt; &lt;span class="n"&gt;CountryData&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;countryData&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;Dictionary&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;,&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;PlayersData&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;playersData&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="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;CountryOption&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="nf"&gt;T20_Data&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="n"&gt;CountryOption&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="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"India"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Ireland"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"England"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Pakistan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Canada"&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="s"&gt;"Australia"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Scotland"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Oman"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"South Africa"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Sri Lanka"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"New Zealand"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Afghanistan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Nepal"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"West Indies"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Uganda"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Papua New Guinea"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Namibia"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Netherlands"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Bangladesh"&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;executingAssembly&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;GetTypeInfo&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="k"&gt;using&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;stream&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;executingAssembly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetManifestResourceStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"_2024_T20_Match.Resources.country_data.json"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
     &lt;span class="k"&gt;using&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;textStream&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;StreamReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
     &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;countryData&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;JsonConvert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DeserializeObject&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Dictionary&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;,&lt;/span&gt; &lt;span class="n"&gt;CountryData&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;textStream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadToEnd&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;Trim&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
     &lt;span class="p"&gt;}&lt;/span&gt;

     &lt;span class="k"&gt;using&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;stream&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;executingAssembly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetManifestResourceStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"_2024_T20_Match.Resources.players_data.json"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
     &lt;span class="k"&gt;using&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;textStream&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;StreamReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
     &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="n"&gt;playersData&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;JsonConvert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DeserializeObject&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Dictionary&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;,&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;PlayersData&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;textStream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadToEnd&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;Trim&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;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="n"&gt;CallerMemberName&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;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;""&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;name&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, we’ve converted the JSON data to a collection using the &lt;strong&gt;StreamReader&lt;/strong&gt; and &lt;strong&gt;JsonConvert.DeserializeObject&lt;/strong&gt; methods from the &lt;a href="https://www.nuget.org/packages/Newtonsoft.Json/" rel="noopener noreferrer"&gt;Newtonsoft.Json&lt;/a&gt; package. Then, we stored the converted data in the appropriate properties.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Defining the layout
&lt;/h2&gt;

&lt;p&gt;Defining the layout is a crucial step in creating a dashboard. The layout determines the overall look and feel, making the dashboard visually appealing and easy to understand. A well-organized layout ensures that the data is presented clearly and intuitively.&lt;/p&gt;

&lt;p&gt;To define the layout, we’ll add a &lt;strong&gt;Border&lt;/strong&gt; and a &lt;strong&gt;Grid&lt;/strong&gt; to arrange the elements neatly. Refer to the following code example.&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;Border&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;"20"&lt;/span&gt; &lt;span class="na"&gt;Padding=&lt;/span&gt;&lt;span class="s"&gt;"7"&lt;/span&gt; &lt;span class="na"&gt;BorderThickness=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt; &lt;span class="na"&gt;CornerRadius=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt; &lt;span class="na"&gt;Background=&lt;/span&gt;&lt;span class="s"&gt;"#007B53"&lt;/span&gt; &lt;span class="na"&gt;BorderBrush=&lt;/span&gt;&lt;span class="s"&gt;"#b0b8bf"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

 &lt;span class="nt"&gt;&amp;lt;Grid&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Grid.RowDefinitions&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;RowDefinition&lt;/span&gt; &lt;span class="na"&gt;Height=&lt;/span&gt;&lt;span class="s"&gt;"50"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;RowDefinition&lt;/span&gt; &lt;span class="na"&gt;Height=&lt;/span&gt;&lt;span class="s"&gt;"*"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;RowDefinition&lt;/span&gt; &lt;span class="na"&gt;Height=&lt;/span&gt;&lt;span class="s"&gt;"*"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Grid.RowDefinitions&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/Grid&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/Border&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4: Arranging the elements in the layout
&lt;/h2&gt;

&lt;p&gt;After defining the layout, we can organize the necessary elements for our app to create a compelling user interface. Here, we’ll focus on creating the following three key parts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;ComboBox:&lt;/strong&gt; To select and view T20 data of different countries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Labels:&lt;/strong&gt; Placed inside the bordered views to represent country-wise data based on the ComboBox selected index.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chart:&lt;/strong&gt; To display player scores for the selected country.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 5: Configuring the Syncfusion WPF ComboBox and header view
&lt;/h2&gt;

&lt;p&gt;The Syncfusion &lt;a href="https://www.syncfusion.com/wpf-controls/combobox" rel="noopener noreferrer"&gt;WPF ComboBox&lt;/a&gt; control offers a versatile dropdown list that supports both single and multiple selections, using delimiters to separate the selected items. Here, we use the &lt;a href="https://help.syncfusion.com/wpf/combobox/getting-started" rel="noopener noreferrer"&gt;ComboBox&lt;/a&gt; to list and choose the country for the T20 match. Additionally, adding a header with a related icon for the dashboard can make the data more readable and visually appealing.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&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;Grid&lt;/span&gt; &lt;span class="na"&gt;Grid.Row=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;Grid.ColumnDefinitions&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ColumnDefinition&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;"1*"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ColumnDefinition&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;"2*"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ColumnDefinition&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;"6*"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ColumnDefinition&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;"1*"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/Grid.ColumnDefinitions&amp;gt;&lt;/span&gt;

 &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Grid.Column=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;"Country"&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"18"&lt;/span&gt; &lt;span class="na"&gt;VerticalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt; &lt;span class="na"&gt;Foreground=&lt;/span&gt;&lt;span class="s"&gt;"#FFFFFF"&lt;/span&gt; &lt;span class="na"&gt;FontWeight=&lt;/span&gt;&lt;span class="s"&gt;"SemiBold"&lt;/span&gt; &lt;span class="na"&gt;HorizontalContentAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

 &lt;span class="nt"&gt;&amp;lt;comboBox:ComboBoxAdv&lt;/span&gt; &lt;span class="na"&gt;Grid.Column=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;x:Name=&lt;/span&gt;&lt;span class="s"&gt;"type"&lt;/span&gt; &lt;span class="na"&gt;HorizontalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Left"&lt;/span&gt; &lt;span class="na"&gt;HorizontalContentAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt; &lt;span class="na"&gt;Height=&lt;/span&gt;&lt;span class="s"&gt;"30"&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;"160"&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"15.5"&lt;/span&gt; &lt;span class="na"&gt;ItemsSource=&lt;/span&gt;&lt;span class="s"&gt;"{Binding CountryOption}"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

 &lt;span class="nt"&gt;&amp;lt;StackPanel&lt;/span&gt; &lt;span class="na"&gt;Grid.Column=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt; &lt;span class="na"&gt;Orientation=&lt;/span&gt;&lt;span class="s"&gt;"Horizontal"&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;"80,0,0,0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Path&lt;/span&gt; &lt;span class="na"&gt;Data=&lt;/span&gt;&lt;span class="s"&gt;"{StaticResource PathData1}"&lt;/span&gt; &lt;span class="na"&gt;Stroke=&lt;/span&gt;&lt;span class="s"&gt;"#FFFFFF"&lt;/span&gt; &lt;span class="na"&gt;StrokeThickness=&lt;/span&gt;&lt;span class="s"&gt;"2.5"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;Path.RenderTransform&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ScaleTransform&lt;/span&gt; &lt;span class="na"&gt;ScaleX=&lt;/span&gt;&lt;span class="s"&gt;"1.2"&lt;/span&gt; &lt;span class="na"&gt;ScaleY=&lt;/span&gt;&lt;span class="s"&gt;"1.2"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/Path.RenderTransform&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Path&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;"Team Wise Stats - 2024"&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"23"&lt;/span&gt; &lt;span class="na"&gt;Foreground=&lt;/span&gt;&lt;span class="s"&gt;"#FFFFFF"&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;"10,0,0,0"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/StackPanel&amp;gt;&lt;/span&gt;

 &lt;span class="nt"&gt;&amp;lt;Path&lt;/span&gt; &lt;span class="na"&gt;Grid.Column=&lt;/span&gt;&lt;span class="s"&gt;"3"&lt;/span&gt; &lt;span class="na"&gt;Data=&lt;/span&gt;&lt;span class="s"&gt;"{StaticResource PathData2}"&lt;/span&gt; &lt;span class="na"&gt;Stroke=&lt;/span&gt;&lt;span class="s"&gt;"#FFFFFF"&lt;/span&gt; &lt;span class="na"&gt;StrokeThickness=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt; &lt;span class="na"&gt;HorizontalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Right"&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;"0,0,20,0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Path.RenderTransform&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;ScaleTransform&lt;/span&gt; &lt;span class="na"&gt;ScaleX=&lt;/span&gt;&lt;span class="s"&gt;"1.2"&lt;/span&gt; &lt;span class="na"&gt;ScaleY=&lt;/span&gt;&lt;span class="s"&gt;"1.2"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Path.RenderTransform&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/Path&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/Grid&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 6: Arranging country-wise T20 content
&lt;/h2&gt;

&lt;p&gt;Next, we’ll organize country-wise play counts, winning statistics, total runs, catches, 6s, 4s, runs scored by boundaries, and details of the best batter and wicket-taker by team, utilizing labels and borders.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&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;Grid&lt;/span&gt; &lt;span class="na"&gt;Grid.Row=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;Grid.RowDefinitions&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;RowDefinition&lt;/span&gt; &lt;span class="na"&gt;Height=&lt;/span&gt;&lt;span class="s"&gt;"*"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;RowDefinition&lt;/span&gt; &lt;span class="na"&gt;Height=&lt;/span&gt;&lt;span class="s"&gt;"*"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;RowDefinition&lt;/span&gt; &lt;span class="na"&gt;Height=&lt;/span&gt;&lt;span class="s"&gt;"*"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/Grid.RowDefinitions&amp;gt;&lt;/span&gt;

 &lt;span class="nt"&gt;&amp;lt;Grid.ColumnDefinitions&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ColumnDefinition&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;"*"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ColumnDefinition&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;"*"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ColumnDefinition&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;"2*"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ColumnDefinition&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;"2*"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/Grid.ColumnDefinitions&amp;gt;&lt;/span&gt;

 &lt;span class="nt"&gt;&amp;lt;Border&lt;/span&gt; &lt;span class="na"&gt;Grid.Row=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;Grid.Column=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;Background=&lt;/span&gt;&lt;span class="s"&gt;"#005F3E"&lt;/span&gt; &lt;span class="na"&gt;BorderThickness=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt; &lt;span class="na"&gt;CornerRadius=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;StackPanel&lt;/span&gt; &lt;span class="na"&gt;HorizontalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt; &lt;span class="na"&gt;VerticalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt; &lt;span class="na"&gt;Orientation=&lt;/span&gt;&lt;span class="s"&gt;"Vertical"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;"Total Played"&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"17"&lt;/span&gt; &lt;span class="na"&gt;Foreground=&lt;/span&gt;&lt;span class="s"&gt;"#FFFFFF"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;"{Binding Play}"&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"19"&lt;/span&gt; &lt;span class="na"&gt;FontWeight=&lt;/span&gt;&lt;span class="s"&gt;"SemiBold"&lt;/span&gt; &lt;span class="na"&gt;HorizontalContentAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt; &lt;span class="na"&gt;Foreground=&lt;/span&gt;&lt;span class="s"&gt;"#5AFEC9"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/StackPanel&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/Border&amp;gt;&lt;/span&gt;

 &lt;span class="nt"&gt;&amp;lt;Border&lt;/span&gt; &lt;span class="na"&gt;Grid.Row=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;Grid.Column=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;Background=&lt;/span&gt;&lt;span class="s"&gt;"#005F3E"&lt;/span&gt; &lt;span class="na"&gt;BorderThickness=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt; &lt;span class="na"&gt;CornerRadius=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;StackPanel&lt;/span&gt; &lt;span class="na"&gt;HorizontalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt; &lt;span class="na"&gt;VerticalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;"Total Wins"&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"17"&lt;/span&gt; &lt;span class="na"&gt;Foreground=&lt;/span&gt;&lt;span class="s"&gt;"#FFFFFF"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;"{Binding Wins}"&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"19"&lt;/span&gt; &lt;span class="na"&gt;FontWeight=&lt;/span&gt;&lt;span class="s"&gt;"SemiBold"&lt;/span&gt; &lt;span class="na"&gt;HorizontalContentAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt; &lt;span class="na"&gt;Foreground=&lt;/span&gt;&lt;span class="s"&gt;"#5AFEC9"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/StackPanel&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/Border&amp;gt;&lt;/span&gt;

 &lt;span class="nt"&gt;&amp;lt;Border&lt;/span&gt; &lt;span class="na"&gt;Grid.Row=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;Grid.Column=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt; &lt;span class="na"&gt;Background=&lt;/span&gt;&lt;span class="s"&gt;"#005F3E"&lt;/span&gt; &lt;span class="na"&gt;BorderThickness=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt; &lt;span class="na"&gt;CornerRadius=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;StackPanel&lt;/span&gt; &lt;span class="na"&gt;HorizontalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt; &lt;span class="na"&gt;VerticalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;"Total Runs Scored"&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"17"&lt;/span&gt; &lt;span class="na"&gt;Foreground=&lt;/span&gt;&lt;span class="s"&gt;"#FFFFFF"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;"{Binding Runs}"&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"19"&lt;/span&gt; &lt;span class="na"&gt;FontWeight=&lt;/span&gt;&lt;span class="s"&gt;"SemiBold"&lt;/span&gt; &lt;span class="na"&gt;HorizontalContentAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt; &lt;span class="na"&gt;Foreground=&lt;/span&gt;&lt;span class="s"&gt;"#5AFEC9"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/StackPanel&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/Border&amp;gt;&lt;/span&gt;

 &lt;span class="nt"&gt;&amp;lt;Border&lt;/span&gt; &lt;span class="na"&gt;Grid.Row=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;Grid.Column=&lt;/span&gt;&lt;span class="s"&gt;"3"&lt;/span&gt; &lt;span class="na"&gt;Grid.ColumnSpan=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt; &lt;span class="na"&gt;Background=&lt;/span&gt;&lt;span class="s"&gt;"#005F3E"&lt;/span&gt; &lt;span class="na"&gt;BorderThickness=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt; &lt;span class="na"&gt;CornerRadius=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;StackPanel&lt;/span&gt; &lt;span class="na"&gt;HorizontalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt; &lt;span class="na"&gt;VerticalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;"Total no of Catches taken"&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"17"&lt;/span&gt; &lt;span class="na"&gt;Foreground=&lt;/span&gt;&lt;span class="s"&gt;"#FFFFFF"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt; 
   &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;"{Binding CatchValue}"&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"19"&lt;/span&gt; &lt;span class="na"&gt;FontWeight=&lt;/span&gt;&lt;span class="s"&gt;"SemiBold"&lt;/span&gt; &lt;span class="na"&gt;HorizontalContentAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt; &lt;span class="na"&gt;Foreground=&lt;/span&gt;&lt;span class="s"&gt;"#5AFEC9"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/StackPanel&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/Border&amp;gt;&lt;/span&gt;

 &lt;span class="nt"&gt;&amp;lt;Border&lt;/span&gt; &lt;span class="na"&gt;Grid.Row=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;Grid.Column=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;Background=&lt;/span&gt;&lt;span class="s"&gt;"#005F3E"&lt;/span&gt; &lt;span class="na"&gt;BorderThickness=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt; &lt;span class="na"&gt;CornerRadius=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;StackPanel&lt;/span&gt; &lt;span class="na"&gt;HorizontalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt; &lt;span class="na"&gt;VerticalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;"Total 6s Scored"&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"17"&lt;/span&gt; &lt;span class="na"&gt;Foreground=&lt;/span&gt;&lt;span class="s"&gt;"#FFFFFF"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;"{Binding Score6s}"&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"19"&lt;/span&gt; &lt;span class="na"&gt;FontWeight=&lt;/span&gt;&lt;span class="s"&gt;"SemiBold"&lt;/span&gt; &lt;span class="na"&gt;HorizontalContentAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt; &lt;span class="na"&gt;Foreground=&lt;/span&gt;&lt;span class="s"&gt;"#5AFEC9"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/StackPanel&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/Border&amp;gt;&lt;/span&gt;

 &lt;span class="nt"&gt;&amp;lt;Border&lt;/span&gt; &lt;span class="na"&gt;Grid.Row=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;Grid.Column=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;Background=&lt;/span&gt;&lt;span class="s"&gt;"#005F3E"&lt;/span&gt; &lt;span class="na"&gt;BorderThickness=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt; &lt;span class="na"&gt;CornerRadius=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;StackPanel&lt;/span&gt; &lt;span class="na"&gt;HorizontalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt; &lt;span class="na"&gt;VerticalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;"Total 4s Scored"&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"17"&lt;/span&gt; &lt;span class="na"&gt;Foreground=&lt;/span&gt;&lt;span class="s"&gt;"#FFFFFF"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;"{Binding Score4s}"&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"19"&lt;/span&gt; &lt;span class="na"&gt;FontWeight=&lt;/span&gt;&lt;span class="s"&gt;"SemiBold"&lt;/span&gt; &lt;span class="na"&gt;HorizontalContentAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt; &lt;span class="na"&gt;Foreground=&lt;/span&gt;&lt;span class="s"&gt;"#5AFEC9"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/StackPanel&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/Border&amp;gt;&lt;/span&gt;

 &lt;span class="nt"&gt;&amp;lt;Border&lt;/span&gt; &lt;span class="na"&gt;Grid.Row=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;Grid.RowSpan=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt; &lt;span class="na"&gt;Grid.Column=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt; &lt;span class="na"&gt;Background=&lt;/span&gt;&lt;span class="s"&gt;"#034D33"&lt;/span&gt; &lt;span class="na"&gt;BorderThickness=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt; &lt;span class="na"&gt;CornerRadius=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Grid&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;Grid.ColumnDefinitions&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ColumnDefinition&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;"*"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ColumnDefinition&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;"*"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/Grid.ColumnDefinitions&amp;gt;&lt;/span&gt;

   &lt;span class="nt"&gt;&amp;lt;Image&lt;/span&gt; &lt;span class="na"&gt;Grid.Column=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;Source=&lt;/span&gt;&lt;span class="s"&gt;"{Binding BatterImage, Converter={StaticResource ImagePathConverter}}"&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;"240"&lt;/span&gt; &lt;span class="na"&gt;Height=&lt;/span&gt;&lt;span class="s"&gt;"210"&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;"30,5,0,5"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

   &lt;span class="nt"&gt;&amp;lt;StackPanel&lt;/span&gt; &lt;span class="na"&gt;Grid.Column=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;Orientation=&lt;/span&gt;&lt;span class="s"&gt;"Vertical"&lt;/span&gt; &lt;span class="na"&gt;VerticalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;"Top Batter "&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"17"&lt;/span&gt; &lt;span class="na"&gt;HorizontalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt; &lt;span class="na"&gt;Foreground=&lt;/span&gt;&lt;span class="s"&gt;"#FFFFFF"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;"{Binding Batter}"&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"19"&lt;/span&gt; &lt;span class="na"&gt;FontWeight=&lt;/span&gt;&lt;span class="s"&gt;"SemiBold"&lt;/span&gt; &lt;span class="na"&gt;HorizontalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt; &lt;span class="na"&gt;Foreground=&lt;/span&gt;&lt;span class="s"&gt;"#5AFEC9"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/StackPanel&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Grid&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/Border&amp;gt;&lt;/span&gt;

 &lt;span class="nt"&gt;&amp;lt;Border&lt;/span&gt; &lt;span class="na"&gt;Grid.Row=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;Grid.RowSpan=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt; &lt;span class="na"&gt;Grid.Column=&lt;/span&gt;&lt;span class="s"&gt;"3"&lt;/span&gt; &lt;span class="na"&gt;Background=&lt;/span&gt;&lt;span class="s"&gt;"#034D33"&lt;/span&gt; &lt;span class="na"&gt;BorderThickness=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt; &lt;span class="na"&gt;CornerRadius=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Grid&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;Grid.ColumnDefinitions&amp;gt;&lt;/span&gt; 
    &lt;span class="nt"&gt;&amp;lt;ColumnDefinition&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;"*"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ColumnDefinition&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;"*"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/Grid.ColumnDefinitions&amp;gt;&lt;/span&gt;

   &lt;span class="nt"&gt;&amp;lt;Image&lt;/span&gt; &lt;span class="na"&gt;Grid.Column=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;Source=&lt;/span&gt;&lt;span class="s"&gt;"{Binding WicketTakerImage, Converter={StaticResource ImagePathConverter}}"&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;"240"&lt;/span&gt; &lt;span class="na"&gt;Height=&lt;/span&gt;&lt;span class="s"&gt;"210"&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;"30,5,0,5"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;StackPanel&lt;/span&gt; &lt;span class="na"&gt;Grid.Column=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;Orientation=&lt;/span&gt;&lt;span class="s"&gt;"Vertical"&lt;/span&gt; &lt;span class="na"&gt;VerticalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;"Top Wicket Taker "&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"17"&lt;/span&gt; &lt;span class="na"&gt;HorizontalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt; &lt;span class="na"&gt;Foreground=&lt;/span&gt;&lt;span class="s"&gt;"#FFFFFF"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;"{Binding WicketTaker}"&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"19"&lt;/span&gt; &lt;span class="na"&gt;FontWeight=&lt;/span&gt;&lt;span class="s"&gt;"SemiBold"&lt;/span&gt; &lt;span class="na"&gt;HorizontalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt; &lt;span class="na"&gt;Foreground=&lt;/span&gt;&lt;span class="s"&gt;"#5AFEC9"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/StackPanel&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Grid&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/Border&amp;gt;&lt;/span&gt;

 &lt;span class="nt"&gt;&amp;lt;Border&lt;/span&gt; &lt;span class="na"&gt;Grid.Row=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt; &lt;span class="na"&gt;Grid.Column=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;Grid.ColumnSpan=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt; &lt;span class="na"&gt;Background=&lt;/span&gt;&lt;span class="s"&gt;"#005F3E"&lt;/span&gt; &lt;span class="na"&gt;BorderThickness=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt; &lt;span class="na"&gt;CornerRadius=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;StackPanel&lt;/span&gt; &lt;span class="na"&gt;HorizontalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt; &lt;span class="na"&gt;VerticalAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;"Runs Scored by Boundaries "&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"17"&lt;/span&gt; &lt;span class="na"&gt;Foreground=&lt;/span&gt;&lt;span class="s"&gt;"#FFFFFF"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;"{Binding Boundaries}"&lt;/span&gt; &lt;span class="na"&gt;FontWeight=&lt;/span&gt;&lt;span class="s"&gt;"SemiBold"&lt;/span&gt; &lt;span class="na"&gt;HorizontalContentAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Center"&lt;/span&gt; &lt;span class="na"&gt;Foreground=&lt;/span&gt;&lt;span class="s"&gt;"#5AFEC9"&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"19"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/StackPanel&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/Border&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/Grid&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 7: Configuring the Syncfusion WPF Chart
&lt;/h2&gt;

&lt;p&gt;Let’s configure the Syncfusion WPF Charts control using this &lt;a href="https://help.syncfusion.com/wpf/charts/getting-started" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&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;Border&lt;/span&gt; &lt;span class="na"&gt;Grid.Row=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt; &lt;span class="na"&gt;Background=&lt;/span&gt;&lt;span class="s"&gt;"#005F3E"&lt;/span&gt; &lt;span class="na"&gt;BorderThickness=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt; &lt;span class="na"&gt;CornerRadius=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

 &lt;span class="nt"&gt;&amp;lt;chart:SfChart&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;chart:SfChart.PrimaryAxis&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;chart:CategoryAxis&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/chart:CategoryAxis&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/chart:SfChart.PrimaryAxis&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;chart:SfChart.SecondaryAxis&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;chart:NumericalAxis&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/chart:NumericalAxis&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/chart:SfChart.SecondaryAxis&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/chart:SfChart&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/Border&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 8: Binding data to the WPF Column Chart
&lt;/h2&gt;

&lt;p&gt;To visualize the 2024 T20 data, we will utilize &lt;a href="https://help.syncfusion.com/cr/wpf/Syncfusion.UI.Xaml.Charts.ColumnSeries.html" rel="noopener noreferrer"&gt;Syncfusion’s WPF ColumnSeries.&lt;/a&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;chart:ColumnSeries&lt;/span&gt; &lt;span class="na"&gt;ItemsSource=&lt;/span&gt;&lt;span class="s"&gt;"{Binding Data}"&lt;/span&gt; &lt;span class="na"&gt;XBindingPath=&lt;/span&gt;&lt;span class="s"&gt;"Name"&lt;/span&gt; &lt;span class="na"&gt;YBindingPath=&lt;/span&gt;&lt;span class="s"&gt;"Score"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/chart:ColumnSeries&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;In the above code example, we’ve bound the &lt;strong&gt;ItemsSource&lt;/strong&gt;, &lt;strong&gt;XBindingPath&lt;/strong&gt;, and &lt;strong&gt;YBindingPath&lt;/strong&gt; properties to the &lt;strong&gt;Data&lt;/strong&gt;, &lt;strong&gt;Name&lt;/strong&gt;, and &lt;strong&gt;Score&lt;/strong&gt; properties, respectively.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 9: Customizing the chart appearance
&lt;/h2&gt;

&lt;p&gt;Let’s enhance the appearance of our WPF Column Chart by customizing its elements, such as the title, axis, series color, and size.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add the chart title
&lt;/h3&gt;

&lt;p&gt;Adding a title can help make the data presented in the chart more easily understood. Refer to the following code example to customize the chart title.&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;chart:SfChart&lt;/span&gt; &lt;span class="na"&gt;HorizontalHeaderAlignment=&lt;/span&gt;&lt;span class="s"&gt;"Left"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

 &lt;span class="nt"&gt;&amp;lt;chart:SfChart.Header&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Content=&lt;/span&gt;&lt;span class="s"&gt;"Top Runs Scorers"&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"15"&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;"5,0,0,0"&lt;/span&gt; &lt;span class="na"&gt;FontWeight=&lt;/span&gt;&lt;span class="s"&gt;"SemiBold"&lt;/span&gt; &lt;span class="na"&gt;Foreground=&lt;/span&gt;&lt;span class="s"&gt;"#FFFFFF"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/chart:SfChart.Header&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/chart:SfChart&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Customize the chart axis
&lt;/h3&gt;

&lt;p&gt;You can customize the chart axis using the following properties:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ShowGridLines:&lt;/strong&gt; Adjusts the visibility of major grid lines on the axis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LabelStyle:&lt;/strong&gt; Modifies the style of axis labels for better visual representation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TickLineSize:&lt;/strong&gt; Customizes the size of ticks along the chart axis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HeaderTemplate:&lt;/strong&gt; Allows customization of the axis title label.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AxisLineStyle:&lt;/strong&gt; Modifies the style of the axis line.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MajorGridLineStyle:&lt;/strong&gt; Adjusts the style of major grid lines on the axis.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These properties provide flexibility in adjusting the visual appearance and functionality of our &lt;a href="https://help.syncfusion.com/wpf/charts/axis" rel="noopener noreferrer"&gt;WPF Chart axis.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&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;chart:SfChart.PrimaryAxis&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;chart:CategoryAxis&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"13"&lt;/span&gt; &lt;span class="na"&gt;ShowGridLines=&lt;/span&gt;&lt;span class="s"&gt;"False"&lt;/span&gt; &lt;span class="na"&gt;TickLineSize=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;AutoScrollingDelta=&lt;/span&gt;&lt;span class="s"&gt;"8"&lt;/span&gt; &lt;span class="na"&gt;AutoScrollingMode=&lt;/span&gt;&lt;span class="s"&gt;"Start"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;chart:CategoryAxis.LabelStyle&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;chart:LabelStyle&lt;/span&gt; &lt;span class="na"&gt;Foreground=&lt;/span&gt;&lt;span class="s"&gt;"#FFFFFF"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/chart:CategoryAxis.LabelStyle&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/chart:CategoryAxis&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/chart:SfChart.PrimaryAxis&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;chart:SfChart.SecondaryAxis&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;chart:NumericalAxis&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"13"&lt;/span&gt; &lt;span class="na"&gt;TickLineSize=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;chart:NumericalAxis.LabelStyle&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;chart:LabelStyle&lt;/span&gt; &lt;span class="na"&gt;Foreground=&lt;/span&gt;&lt;span class="s"&gt;"#FFFFFF"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/chart:NumericalAxis.LabelStyle&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;chart:NumericalAxis.MajorGridLineStyle&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;Style&lt;/span&gt; &lt;span class="na"&gt;TargetType=&lt;/span&gt;&lt;span class="s"&gt;"Line"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Setter&lt;/span&gt; &lt;span class="na"&gt;Property=&lt;/span&gt;&lt;span class="s"&gt;"StrokeThickness"&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Setter&lt;/span&gt; &lt;span class="na"&gt;Property=&lt;/span&gt;&lt;span class="s"&gt;"Stroke"&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;"Gray"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Setter&lt;/span&gt; &lt;span class="na"&gt;Property=&lt;/span&gt;&lt;span class="s"&gt;"StrokeDashArray"&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;"2,2"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/Style&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/chart:NumericalAxis.MajorGridLineStyle&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;chart:NumericalAxis.AxisLineStyle&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;Style&lt;/span&gt; &lt;span class="na"&gt;TargetType=&lt;/span&gt;&lt;span class="s"&gt;"Line"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Setter&lt;/span&gt; &lt;span class="na"&gt;Property=&lt;/span&gt;&lt;span class="s"&gt;"StrokeThickness"&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/Style&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/chart:NumericalAxis.AxisLineStyle&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;chart:NumericalAxis.HeaderTemplate&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;DataTemplate&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;TextBlock&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"RUNS"&lt;/span&gt; &lt;span class="na"&gt;Padding=&lt;/span&gt;&lt;span class="s"&gt;"0,3,0,4"&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"14"&lt;/span&gt; &lt;span class="na"&gt;Foreground=&lt;/span&gt;&lt;span class="s"&gt;"#FFFFFF"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/DataTemplate&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/chart:NumericalAxis.HeaderTemplate&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/chart:NumericalAxis&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/chart:SfChart.SecondaryAxis&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Customize the chart color and size
&lt;/h3&gt;

&lt;p&gt;The following code example shows how to customize the chart’s size and color using the &lt;strong&gt;SegmentSpacing&lt;/strong&gt; and &lt;strong&gt;Interior&lt;/strong&gt; properties, respectively.&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;chart:ColumnSeries&lt;/span&gt; &lt;span class="na"&gt;SegmentSpacing=&lt;/span&gt;&lt;span class="s"&gt;"0.3"&lt;/span&gt; &lt;span class="na"&gt;Interior=&lt;/span&gt;&lt;span class="s"&gt;"#EDFF23"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/chart:ColumnSeries&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Incorporating panning and tooltip
&lt;/h3&gt;

&lt;p&gt;To enhance readability, we can also enable tooltips to display detailed information and panning to scroll through series within a specific range. This can be achieved using properties such as &lt;a href="https://help.syncfusion.com/wpf/charts/interactive-features/tooltip" rel="noopener noreferrer"&gt;ShowTooltip,&lt;/a&gt; &lt;a href="https://help.syncfusion.com/wpf/charts/interactive-features/zoompan" rel="noopener noreferrer"&gt;ChartZoomPanBehavior,&lt;/a&gt; and &lt;a href="https://help.syncfusion.com/wpf/charts/axis#autoscrollingdelta" rel="noopener noreferrer"&gt;AutoScrollingDelta&lt;/a&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;chart:SfChart.Behaviors&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;chart:ChartZoomPanBehavior&lt;/span&gt; &lt;span class="na"&gt;EnableMouseWheelZooming=&lt;/span&gt;&lt;span class="s"&gt;"False"&lt;/span&gt; &lt;span class="na"&gt;EnablePinchZooming=&lt;/span&gt;&lt;span class="s"&gt;"False"&lt;/span&gt; &lt;span class="na"&gt;ResetOnDoubleTap=&lt;/span&gt;&lt;span class="s"&gt;"False"&lt;/span&gt; &lt;span class="na"&gt;EnablePanning=&lt;/span&gt;&lt;span class="s"&gt;"True"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/chart:ChartZoomPanBehavior&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/chart:SfChart.Behaviors&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;chart:SfChart.PrimaryAxis&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;chart:CategoryAxis&lt;/span&gt; &lt;span class="na"&gt;AutoScrollingDelta=&lt;/span&gt;&lt;span class="s"&gt;"8"&lt;/span&gt; &lt;span class="na"&gt;AutoScrollingMode=&lt;/span&gt;&lt;span class="s"&gt;"Start"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/chart:CategoryAxis&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/chart:SfChart.PrimaryAxis&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;chart:SfChart.SecondaryAxis&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;chart:NumericalAxis&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/chart:NumericalAxis&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/chart:SfChart.SecondaryAxis&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;chart:ColumnSeries&lt;/span&gt; &lt;span class="na"&gt;ShowTooltip=&lt;/span&gt;&lt;span class="s"&gt;"True"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 10: Enabling interactivity for the entire dashboard
&lt;/h2&gt;

&lt;p&gt;Let’s enhance our chart dashboard interactivity using the ComboBox. This will also allow us to dynamically select different countries that participated in the 2024 T20 matches.&lt;/p&gt;

&lt;p&gt;Here, we utilize the &lt;a href="https://help.syncfusion.com/wpf/combobox/getting-started#selection" rel="noopener noreferrer"&gt;ComboBox’s&lt;/a&gt; &lt;strong&gt;SelectedIndex&lt;/strong&gt; property to dynamically update the entire dashboard. This includes updating country-specific data and player details based on the country choosen in the ComboBox.&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;comboBox:ComboBoxAdv&lt;/span&gt; &lt;span class="na"&gt;SelectedIndex=&lt;/span&gt;&lt;span class="s"&gt;"{Binding SelectedIndex}"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the following code example, we have created the &lt;strong&gt;SelectedIndex&lt;/strong&gt; property to store the T20 data.&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;T20_Data&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;selectedIndex&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;SelectedIndex&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;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;selectedIndex&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;selectedIndex&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;UpdateIndex&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="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="nf"&gt;T20_Data&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="n"&gt;SelectedIndex&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&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;UpdateIndex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="k"&gt;value&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="k"&gt;value&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;CountryOption&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&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="n"&gt;selectedCountry&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CountryOption&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="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;countryData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ContainsKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;selectedCountry&lt;/span&gt;&lt;span class="p"&gt;))&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;data&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;countryData&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;selectedCountry&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; 
           &lt;span class="n"&gt;Play&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Play&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
           &lt;span class="n"&gt;Wins&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Wins&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
           &lt;span class="n"&gt;Runs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Runs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
           &lt;span class="n"&gt;CatchValue&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CatchValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
           &lt;span class="n"&gt;Score6s&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Score6s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
           &lt;span class="n"&gt;Score4s&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Score4s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
           &lt;span class="n"&gt;Boundaries&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Boundaries&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
           &lt;span class="n"&gt;Batter&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Batter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
           &lt;span class="n"&gt;BatterImage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BatterImage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
           &lt;span class="n"&gt;WicketTaker&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WicketTaker&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
           &lt;span class="n"&gt;WicketTakerImage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WicketTakerImage&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;playersData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ContainsKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;selectedCountry&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
           &lt;span class="n"&gt;Data&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;PlayersData&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;playersData&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;selectedCountry&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;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After executing the previous code examples, the output will look like the following image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VEo6jZg0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Visualizing-the-2024-T20-World-Cup-data-using-the-Syncfusion-WPF-Column-Chart.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VEo6jZg0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Visualizing-the-2024-T20-World-Cup-data-using-the-Syncfusion-WPF-Column-Chart.jpg" alt="Visualizing the 2024 T20 World Cup data using the Syncfusion WPF Column Chart" width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Visualizing the 2024 T20 World Cup data using the Syncfusion WPF Column Chart&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub reference
&lt;/h2&gt;

&lt;p&gt;For more details, please refer to the project on &lt;a href="https://github.com/SyncfusionExamples/Creating-a-WPF-column-chart-dashboard-to-visualize-the-details-of-the-2024-T20-World-Cup" rel="noopener noreferrer"&gt;GitHub.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Thanks for reading! In this blog, we have explored how to visualize the 2024 T20 World Cup tournament data using the &lt;a href="https://www.syncfusion.com/wpf-controls/charts/wpf-column-chart" rel="noopener noreferrer"&gt;Syncfusion WPF Column Chart.&lt;/a&gt; We highly recommend following the steps outlined in this blog and sharing your feedback in the comments section below.&lt;/p&gt;

&lt;p&gt;If you need any assistance, please do not hesitate to contact us via our &lt;a href="https://www.syncfusion.com/forums" rel="noopener noreferrer"&gt;support forum,&lt;/a&gt; &lt;a href="https://support.syncfusion.com/" rel="noopener noreferrer"&gt;support portal,&lt;/a&gt; or &lt;a href="https://www.syncfusion.com/feedback" rel="noopener noreferrer"&gt;feedback portal.&lt;/a&gt; We are always eager to help you!&lt;/p&gt;

&lt;h2&gt;
  
  
  Related blogs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/wpf-doughnut-chart-europe-parliament" rel="noopener noreferrer"&gt;Creating a WPF Doughnut Chart to Visualize the New European Parliament’s Composition in 2024&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/wpf-range-bar-chart-hearing-range" rel="noopener noreferrer"&gt;Creating a WPF Range Bar Chart to Visualize the Hearing Range of Living Beings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/wpf-pie-chart-global-forest-area" rel="noopener noreferrer"&gt;Creating a WPF Pie Chart to Visualize the Percentage of Global Forest Area for Each Country&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/wpf-sunburst-chart-syncfusion-blogs" rel="noopener noreferrer"&gt;Creating a WPF Sunburst Chart to Visualize the Syncfusion Chart of the Week Blog Series&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>wpf</category>
      <category>chart</category>
      <category>desktop</category>
      <category>development</category>
    </item>
    <item>
      <title>Making Payments Easy: Using .NET MAUI Radio Button for Payment Apps and Digital Wallets</title>
      <dc:creator>Gayathri-github7</dc:creator>
      <pubDate>Tue, 23 Jul 2024 14:42:08 +0000</pubDate>
      <link>https://dev.to/syncfusion/making-payments-easy-using-net-maui-radio-button-for-payment-apps-and-digital-wallets-32jk</link>
      <guid>https://dev.to/syncfusion/making-payments-easy-using-net-maui-radio-button-for-payment-apps-and-digital-wallets-32jk</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Learn how to streamline payment selection in your apps and digital wallets using the Syncfusion .NET MAUI Radio Button control. This blog covers implementation steps and customization options to create a user-friendly payment interface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Good design is good business.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;– Thomas J. Watson Jr.&lt;/p&gt;

&lt;p&gt;In today’s fast-paced digital world, payment apps and digital wallets have become essential tools for managing finances and making transactions. These applications offer convenience, speed, and security, allowing us to complete purchases with just a few taps on our smartphones.&lt;/p&gt;

&lt;p&gt;With the rise of e-commerce and online shopping, a seamless and intuitive payment selection interface is crucial.&lt;/p&gt;

&lt;p&gt;In this blog, we’ll explore how to implement a streamlined payment selection interface using the &lt;a href="https://www.syncfusion.com/maui-controls/maui-radio-button" rel="noopener noreferrer"&gt;Syncfusion .NET MAUI Radio Button&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Syncfusion .NET MAUI Radio Button: An overview
&lt;/h2&gt;

&lt;p&gt;The .NET MAUI Radio Button is a selection control that enables users to choose a single option from a set of pre-defined choices. Its key features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://help.syncfusion.com/maui/radio-button/getting-started#change-the-radio-button-state" rel="noopener noreferrer"&gt;States&lt;/a&gt;: It has two selection states: &lt;strong&gt;Checked&lt;/strong&gt; and &lt;strong&gt;Unchecked&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://help.syncfusion.com/maui/radio-button/grouping" rel="noopener noreferrer"&gt;Grouping&lt;/a&gt;: Radio buttons can be grouped within any layout.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://help.syncfusion.com/maui/radio-button/visual-customization" rel="noopener noreferrer"&gt;Customizations&lt;/a&gt;: You can customize the checked and unchecked colors, stroke thickness, and text appearance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single selection&lt;/strong&gt; : It allows us to select only one option from a set, ensuring that users make a single choice.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Choosing the right payment method
&lt;/h2&gt;

&lt;p&gt;A payment app offers various payment options, such as credit/debit cards, UPI, or bank transfers. Encouraging users to pick their preferred payment method is essential for a smooth checkout experience.&lt;/p&gt;

&lt;p&gt;Here, we will use our Syncfusion .NET MAUI Radio Button to implement the payment selection interface. Refer to the following image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--h6EaBYgU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Choosing-the-right-payment-method-using-.NET-MAUI-Radio-Button.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--h6EaBYgU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Choosing-the-right-payment-method-using-.NET-MAUI-Radio-Button.png" alt="Choosing the right payment method using .NET MAUI Radio Button" width="237" height="166"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Integrating Syncfusion .NET MAUI Radio Button to simplify payment method selection
&lt;/h2&gt;

&lt;p&gt;Follow the steps to design and implement payment method selection UI using the .NET MAUI Radio Button.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step #1: Create a simple .NET MAUI Radio Button
&lt;/h3&gt;

&lt;p&gt;Start by referring to the &lt;a href="https://help.syncfusion.com/maui/radio-button/getting-started" rel="noopener noreferrer"&gt;Syncfusion .NET MAUI Radio Button documentation&lt;/a&gt; to create a .NET MAUI app and include the Radio Button control. The &lt;a href="https://help.syncfusion.com/cr/maui/Syncfusion.Maui.Buttons.SfRadioButton.html#Syncfusion_Maui_Buttons_SfRadioButton_IsChecked" rel="noopener noreferrer"&gt;IsChecked&lt;/a&gt; property indicates whether a specific payment method is selected among the available options.&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;buttons:SfRadioButton&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"UPI"&lt;/span&gt; &lt;span class="na"&gt;IsChecked=&lt;/span&gt;&lt;span class="s"&gt;"True"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step #2: Group Radio Buttons
&lt;/h3&gt;

&lt;p&gt;You can group a set of radio buttons using the &lt;a href="https://help.syncfusion.com/cr/maui/Syncfusion.Maui.Buttons.SfRadioGroup.html" rel="noopener noreferrer"&gt;SfRadioGroup&lt;/a&gt; class. This class is a container that ensures only one radio button is selected within the same group.&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;buttons:SfRadioGroup&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;buttons:SfRadioButton&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"UPI"&lt;/span&gt; &lt;span class="na"&gt;IsChecked=&lt;/span&gt;&lt;span class="s"&gt;"True"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;buttons:SfRadioButton&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Credit/Debit/ATM Card"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;buttons:SfRadioButton&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Net Banking"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;buttons:SfRadioButton&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Cash on Delivery"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/buttons:SfRadioGroup&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step #3: Select payment options
&lt;/h3&gt;

&lt;p&gt;Let’s implement the code to choose any of the available payment options and take the necessary actions in the &lt;a href="https://help.syncfusion.com/cr/maui/Syncfusion.Maui.Buttons.ToggleButton.html#Syncfusion_Maui_Buttons_ToggleButton_StateChanged" rel="noopener noreferrer"&gt;StateChanged&lt;/a&gt; event. This event is triggered when the &lt;strong&gt;IsChecked&lt;/strong&gt; state changes.&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;buttons:SfRadioGroup&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;buttons:SfRadioButton&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"UPI"&lt;/span&gt; &lt;span class="na"&gt;StateChanged=&lt;/span&gt;&lt;span class="s"&gt;"PaymentOption_Selected"&lt;/span&gt; &lt;span class="na"&gt;IsChecked=&lt;/span&gt;&lt;span class="s"&gt;"True"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;buttons:SfRadioButton&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Credit/Debit/ATM Card"&lt;/span&gt; &lt;span class="na"&gt;StateChanged=&lt;/span&gt;&lt;span class="s"&gt;"PaymentOption_Selected"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;buttons:SfRadioButton&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Net Banking"&lt;/span&gt; &lt;span class="na"&gt;StateChanged=&lt;/span&gt;&lt;span class="s"&gt;"PaymentOption_Selected"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;buttons:SfRadioButton&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Cash on Delivery"&lt;/span&gt; &lt;span class="na"&gt;StateChanged=&lt;/span&gt;&lt;span class="s"&gt;"PaymentOption_Selected"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/buttons:SfRadioGroup&amp;gt;&lt;/span&gt;

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

&lt;/div&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;PaymentOption_Selected&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;StateChangedEventArgs&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="c1"&gt;// Add your code here.&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step #4: Customize the payment form
&lt;/h3&gt;

&lt;p&gt;In this example, we’ll enhance the payment form UI by adding text input layout controls for entering the name, mobile number, and email ID. Additionally, we’ll create separate sections for each payment option, as shown below.&lt;/p&gt;

&lt;p&gt;Refer to the code example in the &lt;a href="https://github.com/SyncfusionExamples/Payment-method-choice-using-.NET-MAUI-Radio-button/blob/master/RadioButtonPaymentOption/MainPage.xaml" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--itH10TGm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Designing-payment-method-selection-UI-using-Syncfusion-.NET-MAUI-Radio-Button.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--itH10TGm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Designing-payment-method-selection-UI-using-Syncfusion-.NET-MAUI-Radio-Button.gif" alt="Designing payment method selection UI using Syncfusion .NET MAUI Radio Button" width="640" height="1284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Designing payment method selection UI using Syncfusion .NET MAUI Radio Button&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub references
&lt;/h2&gt;

&lt;p&gt;For more details, refer to designing and implementing payment method selection UI using the &lt;a href="https://github.com/SyncfusionExamples/Payment-method-choice-using-.NET-MAUI-Radio-button" rel="noopener noreferrer"&gt;.NET MAUI Radio Button&lt;/a&gt; demo on GitHub.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Thanks for reading! In this blog, we’ve explored how to use the Syncfusion &lt;a href="https://www.syncfusion.com/maui-controls/maui-radio-button" rel="noopener noreferrer"&gt;.NET MAUI Radio Button&lt;/a&gt; to design a payment method selection UI that empowers users to choose a payment method quickly and efficiently. Give it a try, and leave your feedback in the comments section below!&lt;/p&gt;

&lt;p&gt;Download the &lt;a href="https://www.syncfusion.com/downloads/maui" rel="noopener noreferrer"&gt;Essential Studio for .NET MAUI&lt;/a&gt; to evaluate the latest features immediately.&lt;/p&gt;

&lt;p&gt;You can also contact us through our &lt;a href="https://www.syncfusion.com/forums" rel="noopener noreferrer"&gt;support forum&lt;/a&gt;, &lt;a href="https://support.syncfusion.com/" rel="noopener noreferrer"&gt;support portal&lt;/a&gt;, or &lt;a href="https://www.syncfusion.com/feedback/" rel="noopener noreferrer"&gt;feedback portal.&lt;/a&gt; We are always happy to help you!&lt;/p&gt;

&lt;h2&gt;
  
  
  Related blogs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/search-products-dotnet-maui-checkbox" rel="noopener noreferrer"&gt;Mastering Shopping: Enhancing Your Product Search with the .NET MAUI CheckBox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/zoom-view-pdf-in-callout-dotnet-maui" rel="noopener noreferrer"&gt;How to Zoom and View the Desired Area in a PDF using .NET MAUI PDF Viewer?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/new-built-in-toolbar-maui-pdf-viewer" rel="noopener noreferrer"&gt;Enhance PDF Viewing and Editing with the New Built-in Toolbar in .NET MAUI PDF Viewer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/dotnet-maui-radial-bar-apple-revenue" rel="noopener noreferrer"&gt;Chart of the Week: Creating the .NET MAUI Radial Bar to Visualize Apple’s Revenue Breakdown&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>dotnetmaui</category>
      <category>development</category>
      <category>mobile</category>
      <category>maui</category>
    </item>
    <item>
      <title>Spice Up Your Data Visualization with Flutter Charts Series Customization</title>
      <dc:creator>Gayathri-github7</dc:creator>
      <pubDate>Tue, 23 Jul 2024 12:03:55 +0000</pubDate>
      <link>https://dev.to/syncfusion/spice-up-your-data-visualization-with-flutter-charts-series-customization-528l</link>
      <guid>https://dev.to/syncfusion/spice-up-your-data-visualization-with-flutter-charts-series-customization-528l</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Explore how to customize the series in Syncfusion Flutter Charts. Learn to modify series colors, apply gradients, and use custom renderers. Discover detailed implementation steps and code examples. Enhance your data visualization with these powerful customization options. &lt;/p&gt;

&lt;p&gt;Effective communication often hinges on the clarity of data presentation, and utilizing charts can significantly enhance the conveyance of information, making it both clear and compelling. Syncfusion Flutter Charts widget has extensive customization features, allowing you to fine-tune your charts to meet your unique requirements.&lt;/p&gt;

&lt;p&gt;In this blog, we’ll explore the options available to customize the series’ appearance in the &lt;a href="https://www.syncfusion.com/flutter-widgets/flutter-charts" rel="noopener noreferrer"&gt;Syncfusion Flutter Charts&lt;/a&gt;.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Series customization options
&lt;/h2&gt;

&lt;p&gt;Let’s see the built-in options to customize the visual representation of the series in the Flutter Charts widget:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Color and border-color&lt;/li&gt;
&lt;li&gt;Point color mapper&lt;/li&gt;
&lt;li&gt;Gradient&lt;/li&gt;
&lt;li&gt;Border gradient&lt;/li&gt;
&lt;li&gt;Shader&lt;/li&gt;
&lt;li&gt;Customize segment method&lt;/li&gt;
&lt;li&gt;Custom series renderer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The following table displays the customization options supported by the Syncfusion Flutter Cartesian Charts series.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Cartesian series&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Point color mapper&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Gradient&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Border gradient&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Shader&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Area series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Bar series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Box and Whiskers series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Bubble series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Candle series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Column series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Error bar series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Fastline series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Hilo open close series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Hilo series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Histogram series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Line series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Range area series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Range column series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Scatter series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Spline series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Spline area series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Spline range area series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Stacked area series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Stacked area 100% series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Stacked bar series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Stacked bar 100% series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Stacked column series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Stacked column 100% series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Stacked line series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Stacked line 100% series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Step area series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Step line series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Waterfall series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Refer to the following table to know the customization options supported by the other Flutter Charts series.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Other series&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Point color mapper&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Gradient&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Border gradient&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Point shader&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Doughnut series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Funnel series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Pie series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Pyramid series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Radial Bar series&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Yes&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Let’s explore these customization options with code examples!&lt;/p&gt;

&lt;h2&gt;
  
  
  Color and border-color
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/ChartSeries/color.html" rel="noopener noreferrer"&gt;color&lt;/a&gt; and &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/AreaSeries/borderColor.html" rel="noopener noreferrer"&gt;border color&lt;/a&gt; properties accept a solid color and will be applied to the entire series. Since the fill color and border color properties are unavailable across all series types, these customization options are limited to specific series. For instance, the bar and area series’ allow customization of fill and border colors, whereas the line series supports color and width customizations.&lt;/p&gt;

&lt;p&gt;Additionally, the area type series supports a border drawing mode option, specifying which sides of the border should be rendered. This can include all sides, only the top of the area series, or excluding the bottom portion.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&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="nc"&gt;SfCartesianChart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;series&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;CartesianSeries&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ChartData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nc"&gt;LineSeries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;
      &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;green&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&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="nc"&gt;BarSeries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;
      &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;indigo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withOpacity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nx"&gt;borderColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;indigo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&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="nc"&gt;AreSeries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;
      &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;purple&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withOpacity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nx"&gt;borderColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;purple&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;borderDrawMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;BorderDrawMode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;top&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;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://res.cloudinary.com/practicaldev/image/fetch/s--x7LvrW6_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Color-and-border-color-customization-options-in-the-Flutter-Charts-series.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--x7LvrW6_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Color-and-border-color-customization-options-in-the-Flutter-Charts-series.png" alt="Color and border color customization options in the Flutter Charts series" width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Color and border color customization options in the Flutter Charts series&lt;/p&gt;

&lt;h2&gt;
  
  
  Point color mapper
&lt;/h2&gt;

&lt;p&gt;The point color mapper is supported in all Flutter Cartesian Chart series types except the area-type series. It allows us to customize the color of individual series segments. The &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/ChartSeries/pointColorMapper.html" rel="noopener noreferrer"&gt;pointColorMapper&lt;/a&gt; callback is called whenever there is a need for the segment color, such as adding or updating the segment, when the data source changes, and more.&lt;/p&gt;

&lt;p&gt;In the following code example, the point color is returned from the &lt;a href="https://api.flutter.dev/flutter/material/Colors/accents-constant.html" rel="noopener noreferrer"&gt;Colors.accents&lt;/a&gt; list using the chart series data point index.&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="nc"&gt;SfCartesianChart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;series&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;CartesianSeries&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ChartData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nc"&gt;ColumnSeries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;
      &lt;span class="nx"&gt;pointColorMapper&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ChartData&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;int&lt;/span&gt; &lt;span class="nx"&gt;index&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="nx"&gt;index&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&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="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;accents&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;accents&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;accents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nx"&gt;index&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;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://res.cloudinary.com/practicaldev/image/fetch/s--t-6fkZHm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Point-color-mapper-in-the-Flutter-Charts-series.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t-6fkZHm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Point-color-mapper-in-the-Flutter-Charts-series.png" alt="Point color mapper in the Flutter Charts series" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Point color mapper in the Flutter Charts series&lt;/p&gt;

&lt;h2&gt;
  
  
  Gradient
&lt;/h2&gt;

&lt;p&gt;It is a type of &lt;a href="https://api.flutter.dev/flutter/painting/LinearGradient-class.html" rel="noopener noreferrer"&gt;LinearGradient&lt;/a&gt; specifically designed to be applied across individual segments within a given series.&lt;/p&gt;

&lt;p&gt;For example, if we have a gradient transitioning from blue to red and a &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/ColumnSeries/ColumnSeries.html" rel="noopener noreferrer"&gt;ColumnSeries&lt;/a&gt; with two data points of 20 and 100, the gradient will be applied uniformly to segments regardless of their values. Ideally, if we were to identify a y-axis midpoint value such as 50, we would expect to see a red tint from the midpoint to above, and the midpoint to below would only have a blue shade. However, the gradient will be applied entirely throughout the respected segment, so both the 20 and 50 data points will have red and blue shades.&lt;/p&gt;

&lt;p&gt;In the following code example, a vertical gradient is used with red and blue colors.&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="nc"&gt;ColumnSeries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;
  &lt;span class="nx"&gt;gradient&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;LinearGradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;colors&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;Color&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;red&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="nx"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Alignment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;topCenter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Alignment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bottomCenter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;stops&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;double&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&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;Refer to the following image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TyXHZRmj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Gradient-support-in-the-Flutter-Chart-series.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TyXHZRmj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Gradient-support-in-the-Flutter-Chart-series.png" alt="Gradient support in the Flutter Charts series" width="800" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gradient support in the Flutter Charts series&lt;/p&gt;

&lt;h2&gt;
  
  
  Border gradient
&lt;/h2&gt;

&lt;p&gt;Like the chart series gradient, a border gradient is a type of &lt;a href="https://api.flutter.dev/flutter/painting/LinearGradient-class.html" rel="noopener noreferrer"&gt;LinearGradient&lt;/a&gt; specifically designed to be applied across individual segments’ borders within a given series. It acts the same as a series gradient, meaning the gradient will be applied uniformly to segments regardless of their values.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&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="nc"&gt;ColumnSeries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;
  &lt;span class="nx"&gt;borderWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;borderRadius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;BorderRadius&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;circular&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nx"&gt;borderGradient&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;LinearGradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;colors&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;Color&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;red&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="nx"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Alignment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;topCenter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Alignment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bottomCenter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;stops&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;double&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&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;Refer to the following image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nktJllVf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Border-gradient-support-in-the-Flutter-Charts-series.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nktJllVf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Border-gradient-support-in-the-Flutter-Charts-series.png" alt="Border gradient support in the Flutter Charts series" width="800" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Border gradient support in the Flutter Charts series&lt;/p&gt;

&lt;h2&gt;
  
  
  Shader
&lt;/h2&gt;

&lt;p&gt;The shader will be applied to the whole series, not specific segments. The &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/CartesianSeries/onCreateShader.html" rel="noopener noreferrer"&gt;onCreateShader&lt;/a&gt; is a callback that is called whenever there is a need for the segment or series color, such as adding or updating, when the data source changes, etc., similar to the &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/ChartSeries/pointColorMapper.html" rel="noopener noreferrer"&gt;pointColorMapper&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For example, if we have a vertical gradient transitioning from blue to red and a &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/ColumnSeries/ColumnSeries.html" rel="noopener noreferrer"&gt;ColumnSeries&lt;/a&gt; with two data points of 20 and 100, the gradient will be applied uniformly to the entire series. Ideally, if we were to identify a y-axis midpoint value such as 50, the red tint would start from the midpoint and extend above, while only having a blue shade below the midpoint. So, the segment with a value of 20 would only have a blue tint, but the segment with a value of 100 should have a gradient from blue to red.&lt;/p&gt;

&lt;p&gt;The shader callback brings the following parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/ShaderDetails/rect.html" rel="noopener noreferrer"&gt;rect&lt;/a&gt; – Holds the respected series render box bounds.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/ShaderDetails/renderType.html" rel="noopener noreferrer"&gt;renderType&lt;/a&gt; – Denotes whether this is called for series or legend.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Refer to the following code example.&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="nc"&gt;ColumnSeries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;
  &lt;span class="nx"&gt;borderRadius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;BorderRadius&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;circular&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nx"&gt;onCreateShader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ShaderDetails&lt;/span&gt; &lt;span class="nx"&gt;details&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="nc"&gt;LinearGradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;colors&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;Color&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;red&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="nx"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Alignment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;topCenter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Alignment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bottomCenter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;stops&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;double&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;createShader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;details&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rect&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;Refer to the following image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--w9wAXZjk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Shader-feature-in-the-Flutter-Charts-series.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--w9wAXZjk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Shader-feature-in-the-Flutter-Charts-series.png" alt="Shader feature in the Flutter Charts series" width="800" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Shader feature in the Flutter Charts series&lt;/p&gt;

&lt;h2&gt;
  
  
  Range-based shader customization
&lt;/h2&gt;

&lt;p&gt;Since the shader returned from &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/CartesianSeries/onCreateShader.html" rel="noopener noreferrer"&gt;onCreateShader&lt;/a&gt; will be applied consistently throughout the series, it is beneficial for anticipating color customization based on positive and negative values.&lt;/p&gt;

&lt;p&gt;For example, the goal is to visually represent positive values with varying shades of green and negative values with different shades of red.&lt;/p&gt;

&lt;p&gt;To accurately apply these color distinctions, it is essential to determine the exact position where the y-axis crosses zero, which serves as the demarcation line between positive and negative values.&lt;/p&gt;

&lt;p&gt;Locating the zero position on the y-axis can be accomplished using a clever technique that utilizes the &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/SfCartesianChart/onActualRangeChanged.html" rel="noopener noreferrer"&gt;onActualRangeChanged&lt;/a&gt; callback function of the axis. This function is triggered when there is a change in the actual range being displayed on the chart. Within this callback, you can calculate the position of the zero value on the y-axis by conducting a simple mathematical operation.&lt;/p&gt;

&lt;p&gt;Take the maximum visible value on the y-axis, referred to as &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/ActualRangeChangedArgs/visibleMax.html" rel="noopener noreferrer"&gt;visibleMax&lt;/a&gt;, and divide it by the total range of values currently visible on the chart. The result of this division will give you a ratio (a position factor) corresponding to the location of the zero value of the y-axis.&lt;/p&gt;

&lt;p&gt;Use this position factor as a midpoint color stop for a &lt;a href="https://api.flutter.dev/flutter/painting/LinearGradient-class.html" rel="noopener noreferrer"&gt;LinearGradient&lt;/a&gt; to create variations in shades of green and red, as illustrated in the following code example.&lt;/p&gt;

&lt;p&gt;To ensure the shader is effectively applied as a mask on the entire series rendering, make sure the series’ &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/ChartSeries/color.html" rel="noopener noreferrer"&gt;color&lt;/a&gt; and &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/SplineAreaSeries/borderColor.html" rel="noopener noreferrer"&gt;borderColor&lt;/a&gt; properties are set. This allows the shader to mask the color correctly. If the borderColor is not set, the shader will not be applied to the border.&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="nx"&gt;double&lt;/span&gt; &lt;span class="nx"&gt;_originColorStopY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;SfCartesianChart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;primaryXAxis&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nc"&gt;DateTimeAxis&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="nx"&gt;onActualRangeChanged&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ActualRangeChangedArgs&lt;/span&gt; &lt;span class="nx"&gt;args&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="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;orientation&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nx"&gt;AxisOrientation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vertical&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;final&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="nx"&gt;range&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;visibleMax&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;visibleMin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="nx"&gt;_originColorStopY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;visibleMax&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;range&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;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nc"&gt;SplineAreaSeries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;
  &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;green&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;borderColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;green&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;onCreateShader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ShaderDetails&lt;/span&gt; &lt;span class="nx"&gt;details&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="nx"&gt;ui&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Gradient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;linear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;details&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;topCenter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;details&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bottomCenter&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;Color&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;green&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;green&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;red&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;red&lt;/span&gt;&lt;span class="p"&gt;,&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;double&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;_originColorStopY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;_originColorStopY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&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;In this example, we used four colors and their corresponding color stop points. The color stops [0, _originColorStopY, _originColorStopY, 1] will be divided into the following segments:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;From 0 to _originColorStopY&lt;/strong&gt; , the colors are mapped as green to green. As a result, we do not observe any gradient transition; instead, we see a solid green color representing the positive value position.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;From _originColorStopY to _originColorStopY&lt;/strong&gt; , this transition is not visible since the start and end stops are the same.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;From _originColorStopY to 1&lt;/strong&gt; , the colors are mapped as red to red. This results in a solid red color transition, indicating the negative portion.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; To add opacity into the shader, it is essential to incorporate the corresponding opacity value into the series’ &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/ChartSeries/color.html" rel="noopener noreferrer"&gt;color&lt;/a&gt; property. By doing this, the shader will derive the opacity value from the color property and then apply it accordingly. This is the current behavior of the Flutter framework to add an opacity to the shader.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HXok6-ax--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Range-based-shader-customization-in-the-Flutter-Charts-series.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HXok6-ax--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Range-based-shader-customization-in-the-Flutter-Charts-series.png" alt="Range-based shader customization in the Flutter Charts series" width="800" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Range-based shader customization in the Flutter Charts series&lt;/p&gt;

&lt;h2&gt;
  
  
  Point shader
&lt;/h2&gt;

&lt;p&gt;It is specific to &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/CircularSeries-class.html" rel="noopener noreferrer"&gt;CircularSeries&lt;/a&gt; and is used to apply individual gradients specific to a segment.&lt;/p&gt;

&lt;p&gt;In the following code example, gradient colors are loaded from a data source and applied using &lt;a href="https://api.flutter.dev/flutter/painting/RadialGradient-class.html" rel="noopener noreferrer"&gt;RadialGradient&lt;/a&gt; to individual segments.&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="nc"&gt;SfCircularChart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;series&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;CircularSeries&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;CircularChartData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
   &lt;span class="nc"&gt;DoughnutSeries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
     &lt;span class="nx"&gt;dataSource&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;CircularChartData&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="nc"&gt;CircularChartData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2021&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;red&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;orange&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nc"&gt;CircularChartData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2022&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;orange&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;purple&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nc"&gt;CircularChartData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2023&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;purple&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;red&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="nx"&gt;pointShaderMapper&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dynamic&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;int&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Color&lt;/span&gt; &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Rect&lt;/span&gt; &lt;span class="nx"&gt;rect&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="nc"&gt;RadialGradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nx"&gt;colors&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;Color&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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="nx"&gt;start&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="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
          &lt;span class="nx"&gt;stops&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;double&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;createShader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rect&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;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://res.cloudinary.com/practicaldev/image/fetch/s--tshPlCmu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Point-shader-customization-in-the-Flutter-Charts-series.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tshPlCmu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Point-shader-customization-in-the-Flutter-Charts-series.gif" alt="Point shader customization in the Flutter Charts series" width="800" height="557"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Point shader customization in the Flutter Charts series&lt;/p&gt;

&lt;h2&gt;
  
  
  Customize chart series segment through method
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/ChartSeriesRenderer/customizeSegment.html" rel="noopener noreferrer"&gt;customizeSegment&lt;/a&gt; method is designed to tailor the visual aspects of a segment according to its index or specific conditions. This method can be overridden in the subclass of the series renderer. Within the &lt;strong&gt;customizeSegment,&lt;/strong&gt; properties such as &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/ChartSegment/fillPaint.html" rel="noopener noreferrer"&gt;fillPaint&lt;/a&gt; and &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/ChartSegment/strokePaint.html" rel="noopener noreferrer"&gt;strokePaint&lt;/a&gt; are accessible, allowing for the segment’s color modifications.&lt;/p&gt;

&lt;p&gt;In the following code example, the shader is applied to the segment with the 10&lt;sup&gt;th&lt;/sup&gt; index. We currently do not have direct properties to apply a gradient to individual segments, but this can be achieved using the &lt;strong&gt;customizeSegment&lt;/strong&gt; method.&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;_ColumnSeriesRenderer&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;ColumnSeriesRenderer&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ChartData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;override&lt;/span&gt;
  &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;customizeSegment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ChartSegment&lt;/span&gt; &lt;span class="nx"&gt;segment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;customizeSegment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;segment&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="nx"&gt;segment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentSegmentIndex&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;segment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fillPaint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;shader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nc"&gt;LinearGradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="na"&gt;colors&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;Color&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;red&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;orange&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="na"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Alignment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;topCenter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Alignment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bottomCenter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;stops&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;double&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;createShader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;paintBounds&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;segment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fillPaint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;shader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&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;Refer to the following image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MAbo_mSP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Customizing-Flutter-Charts-series-segments-using-methods.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MAbo_mSP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Customizing-Flutter-Charts-series-segments-using-methods.png" alt="Customizing Flutter Charts series segments using methods" width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Customizing Flutter Charts series segments using methods&lt;/p&gt;

&lt;h2&gt;
  
  
  Custom series renderer
&lt;/h2&gt;

&lt;p&gt;This is the final and most important option available in the series, allowing us to render our own series. Creating our series renderer allows us to draw the required shapes on each segment.&lt;/p&gt;

&lt;p&gt;To do this, create a custom renderer class by extending an existing series renderer and then sharing this custom renderer with the series through the &lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/CartesianSeries/onCreateRenderer.html" rel="noopener noreferrer"&gt;onCreateRenderer&lt;/a&gt; callback. The following are the major key factors of the renderer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/ChartSeriesRenderer/createSegment.html" rel="noopener noreferrer"&gt;createSegment&lt;/a&gt;: To create segments based on data points.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/ChartSeriesRenderer/customizeSegment.html" rel="noopener noreferrer"&gt;customizeSegment&lt;/a&gt;: To customize the segment appearance based on its index or specific case.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/ChartSegment/onPaint.html" rel="noopener noreferrer"&gt;onPaint&lt;/a&gt;: To paint series.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then, create a custom segment class by extending an existing segment class, mapping it with the series renderer by overriding the &lt;strong&gt;createSegment&lt;/strong&gt; method, and returning it.&lt;/p&gt;

&lt;p&gt;Once the custom segment is mapped with the series, the base implementation passes the respective data point values into the segment and transforms them into pixel values. Therefore, in the next step, override the segment’s  &lt;strong&gt;onPaint&lt;/strong&gt; method to implement the desired drawing logic.&lt;/p&gt;

&lt;p&gt;In the following code example, we have drawn an oval shape to replace a column segment.&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="nc"&gt;ColumnSeries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;
  &lt;span class="nx"&gt;borderColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pink&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;onCreateRenderer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ChartSeries&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ChartData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;series&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="nc"&gt;_ColumnSeriesRenderer&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;_ColumnSeriesRenderer&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;ColumnSeriesRenderer&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ChartData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;override&lt;/span&gt;
  &lt;span class="nx"&gt;ColumnSegment&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ChartData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;createSegment&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;_ColumnSegment&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;_ColumnSegment&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;ColumnSegment&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ChartData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;override&lt;/span&gt;
  &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;onPaint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Canvas&lt;/span&gt; &lt;span class="nx"&gt;canvas&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="nx"&gt;segmentRect&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&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="p"&gt;}&lt;/span&gt;
    &lt;span class="nx"&gt;final&lt;/span&gt; &lt;span class="nx"&gt;Rect&lt;/span&gt; &lt;span class="nx"&gt;fillRect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;segmentRect&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;outerRect&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drawOval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fillRect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fillPaint&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;final&lt;/span&gt; &lt;span class="nx"&gt;Rect&lt;/span&gt; &lt;span class="nx"&gt;borderRect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fillRect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deflate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;series&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;borderWidth&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drawOval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;borderRect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;strokePaint&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;Refer to the following image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZkJ1d5Tv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Custom-series-rendering-feature-in-the-Flutter-Charts.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZkJ1d5Tv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.syncfusion.com/blogs/wp-content/uploads/2024/07/Custom-series-rendering-feature-in-the-Flutter-Charts.png" alt="Custom series rendering feature in the Flutter Charts" width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Custom series rendering feature in the Flutter Charts&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub reference
&lt;/h2&gt;

&lt;p&gt;For more details, refer to the &lt;a href="https://github.com/SyncfusionExamples/flutter_chart_series_customization" rel="noopener noreferrer"&gt;Flutter Charts series customization GitHub demos&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Thanks for reading! In this blog, we’ve explored the series customization options in the Syncfusion &lt;a href="https://www.syncfusion.com/flutter-widgets/flutter-charts" rel="noopener noreferrer"&gt;Flutter Charts&lt;/a&gt; widget. Use these features to visualize your data and get valuable insights. Give it a try, and leave your feedback in the comment section below.&lt;/p&gt;

&lt;p&gt;If you need a new widget for the Flutter framework or new features in our existing widgets, you can contact us through our &lt;a href="https://www.syncfusion.com/forums" rel="noopener noreferrer"&gt;support forum&lt;/a&gt;, &lt;a href="https://support.syncfusion.com/" rel="noopener noreferrer"&gt;support portal&lt;/a&gt;, or &lt;a href="https://www.syncfusion.com/feedback/flutter" rel="noopener noreferrer"&gt;feedback portal&lt;/a&gt;. As always, we are happy to assist you!&lt;/p&gt;

&lt;h2&gt;
  
  
  Related blogs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/adding-scrollbar-in-flutter-charts" rel="noopener noreferrer"&gt;How to add a scrollbar to Syncfusion Flutter Charts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/digitally-sign-pdf-flutter-pdf-viewer" rel="noopener noreferrer"&gt;3 Easy Steps to Digitally Sign PDFs in Your Flutter App&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/synchronize-multiple-flutter-charts" rel="noopener noreferrer"&gt;Easily Synchronize Multiple Charts in Your Flutter App Like a Pro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/roc-and-wma-indicators-flutter-charts" rel="noopener noreferrer"&gt;Introducing the New ROC and WMA Indicators in Flutter Charts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>flutter</category>
      <category>chart</category>
      <category>mobile</category>
      <category>desktop</category>
    </item>
    <item>
      <title>Chart of the Week: Creating the .NET MAUI Scatter Chart to Visualize Different Sports Ball Sizes and Weights</title>
      <dc:creator>Gayathri-github7</dc:creator>
      <pubDate>Wed, 19 Jun 2024 13:18:24 +0000</pubDate>
      <link>https://dev.to/syncfusion/chart-of-the-week-creating-the-net-maui-scatter-chart-to-visualize-different-sports-ball-sizes-and-weights-ce</link>
      <guid>https://dev.to/syncfusion/chart-of-the-week-creating-the-net-maui-scatter-chart-to-visualize-different-sports-ball-sizes-and-weights-ce</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Let’s use the Syncfusion .NET MAUI Scatter Chart to visualize the sizes and weights of various sports balls and highlight their differences. This blog guides you through gathering data, preparing it, configuring the chart, and customizing its appearance and interactivity. Explore the GitHub demo for more details.&lt;/p&gt;

&lt;p&gt;Welcome to our &lt;strong&gt;Chart of the Week&lt;/strong&gt; blog series!&lt;/p&gt;

&lt;p&gt;Today, we’ll visualize the sizes and weights of various sports balls using the &lt;a href="https://www.syncfusion.com/maui-controls/maui-cartesian-charts/chart-types/maui-scatter-chart" rel="noopener noreferrer"&gt;Syncfusion .NET MAUI  Scatter Chart.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sports enthusiasts know that most sports use balls, which vary widely in size and weight. Understanding these variations can provide fascinating insights into the design and dynamics of each sport. The lightest ball is a Table Tennis ball, and the largest ball size is Basketball. These differences reflect each sport’s unique demands and rules, providing a deeper appreciation for their diversity.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.syncfusion.com/maui-controls/maui-cartesian-charts/chart-types/maui-scatter-chart" rel="noopener noreferrer"&gt;Syncfusion .NET MAUI Scatter Chart&lt;/a&gt; is ideal for showcasing these differences. A scatter chart plots data points on a two-dimensional graph, making it easy to observe relationships between variables. The chart’s feature set includes data binding, tooltips, titles, and customizable axes, ensuring a clear and engaging visualization.&lt;/p&gt;

&lt;p&gt;The following image shows the scatter chart we are going to create.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2024%2F06%2FVisualizing-different-sports-ball-sizes-and-weights-using-the-.NET-MAUI-Scatter-Chart.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2024%2F06%2FVisualizing-different-sports-ball-sizes-and-weights-using-the-.NET-MAUI-Scatter-Chart.png" alt="Visualizing different sports ball sizes and weights using the .NET MAUI Scatter Chart"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Step 1: Gathering the data
&lt;/h2&gt;

&lt;p&gt;First, we need to gather information from the &lt;a href="https://www.topendsports.com/resources/equipment/balls.htm" rel="noopener noreferrer"&gt;topend sports.&lt;/a&gt; We require data on ball &lt;a href="https://www.topendsports.com/resources/equipment/ball-size.htm" rel="noopener noreferrer"&gt;Sizes&lt;/a&gt; and &lt;a href="https://www.topendsports.com/resources/equipment/ball-weight.htm" rel="noopener noreferrer"&gt;weights&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Prepare the data for the chart
&lt;/h2&gt;

&lt;p&gt;Create a &lt;strong&gt;SportsBallModel&lt;/strong&gt; class to define the structure of our sports ball data and a &lt;strong&gt;SportsBallViewModel&lt;/strong&gt; class to handle the data manipulation and communication between the model and the scatter chart.&lt;/p&gt;

&lt;p&gt;First, define the &lt;strong&gt;SportsBallModel&lt;/strong&gt; class with the following properties:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name:&lt;/strong&gt; Denotes the name of the sports ball, indicating the specific type or variant it represents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Size:&lt;/strong&gt; Describes the dimensions of the sports ball, specifying its diameter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weight:&lt;/strong&gt; Quantifies the mass of the sports ball, measured in units such as grams.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Refer to the following code example.&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;SportsBallModel&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;Name&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;double&lt;/span&gt; &lt;span class="n"&gt;Size&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;double&lt;/span&gt; &lt;span class="n"&gt;Weight&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="nf"&gt;SportsBallModel&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;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;)&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;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;Weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;weight&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;Next, create the &lt;strong&gt;SportsBallViewModel&lt;/strong&gt; class. It acts as an intermediary between the data models and user interface elements (&lt;a href="https://help.syncfusion.com/cr/maui/Syncfusion.Maui.Charts.ScatterSeries.html" rel="noopener noreferrer"&gt;scatter chart&lt;/a&gt;), preparing and formatting data for display and interaction.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&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;SportsBallViewModel&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;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;SportsBallModel&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SportsBallData&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="nf"&gt;SportsBallViewModel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="n"&gt;SportsBallData&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;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;SportsBallModel&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
        &lt;span class="n"&gt;SportsBallData&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SportsBallModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;3.96&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="s"&gt;"Squash"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="n"&gt;SportsBallData&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SportsBallModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;3.99&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="s"&gt;"Table Tennis"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="n"&gt;SportsBallData&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SportsBallModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;45.93&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;4.27&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="s"&gt;"Golf"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="n"&gt;SportsBallData&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SportsBallModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;125&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;5.59&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="s"&gt;"Jai Alai"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="n"&gt;SportsBallData&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SportsBallModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Weight&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;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;5.72&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="s"&gt;"Racquetball"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="n"&gt;SportsBallData&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SportsBallModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;156&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;5.72&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="s"&gt;"Pool"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="n"&gt;SportsBallData&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SportsBallModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;142&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;6.35&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="s"&gt;"Lacrosse"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="n"&gt;SportsBallData&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SportsBallModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;56.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;6.54&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="s"&gt;"Tennis"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="n"&gt;SportsBallData&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SportsBallModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;680&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;7.94&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="s"&gt;"Pétanque"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="n"&gt;SportsBallData&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SportsBallModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;155.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;7.11&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="s"&gt;"Cricket"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="n"&gt;SportsBallData&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SportsBallModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;156&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;7.11&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="s"&gt;"Field Hockey"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="n"&gt;SportsBallData&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SportsBallModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;142&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;7.30&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="s"&gt;"Baseball"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="n"&gt;SportsBallData&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SportsBallModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;22.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;7.29&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="s"&gt;"Pickleball"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="n"&gt;SportsBallData&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SportsBallModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;7.62&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="s"&gt;"Polo"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="n"&gt;SportsBallData&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SportsBallModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;166.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;8.89&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="s"&gt;"Softball (slowpitch)"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="n"&gt;SportsBallData&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SportsBallModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;453.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;9.21&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="s"&gt;"Croquet"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="n"&gt;SportsBallData&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SportsBallModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;178&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;9.70&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="s"&gt;"Softball (fastpitch)"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="n"&gt;SportsBallData&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SportsBallModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;920&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;10.67&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="s"&gt;"Bocce"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="n"&gt;SportsBallData&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SportsBallModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;18.03&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="s"&gt;"Rhythmic gymnastics ball"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="n"&gt;SportsBallData&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SportsBallModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;425&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;18.54&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="s"&gt;"Team Handball"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="n"&gt;SportsBallData&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SportsBallModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;260&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;20.70&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="s"&gt;"Volleyball"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="n"&gt;SportsBallData&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SportsBallModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;420&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;21.59&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="s"&gt;"Football (Soccer)"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="n"&gt;SportsBallData&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SportsBallModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;445&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;21.59&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="s"&gt;"Korfball"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="n"&gt;SportsBallData&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SportsBallModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;21.59&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="s"&gt;"Water polo"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="n"&gt;SportsBallData&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SportsBallModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;397&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;22.61&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="s"&gt;"Netball"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="n"&gt;SportsBallData&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SportsBallModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Weight&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;623.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;23.88&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="s"&gt;"Basketball"&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 3: Configure the Syncfusion .NET MAUI Cartesian Charts
&lt;/h2&gt;

&lt;p&gt;Let’s configure the .NET MAUI Cartesian Charts control using this &lt;a href="https://help.syncfusion.com/maui/cartesian-charts/getting-started" rel="noopener noreferrer"&gt;documentation.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&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;chart:SfCartesianChart&amp;gt;&lt;/span&gt;

 &lt;span class="nt"&gt;&amp;lt;chart:SfCartesianChart.XAxes&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;chart:CategoryAxis/&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/chart:SfCartesianChart.XAxes&amp;gt;&lt;/span&gt;

 &lt;span class="nt"&gt;&amp;lt;chart:SfCartesianChart.YAxes&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;chart:NumericalAxis/&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/chart:SfCartesianChart.YAxes&amp;gt;&lt;/span&gt;  

&lt;span class="nt"&gt;&amp;lt;/chart:SfCartesianChart&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4: Bind data to the .NET MAUI Scatter series
&lt;/h2&gt;

&lt;p&gt;To display the sports ball data effectively, we’ll utilize the Syncfusion &lt;strong&gt;ScatterSeries&lt;/strong&gt; instance and bind our &lt;strong&gt;SportsBallData&lt;/strong&gt; collection to it. Each ball will be represented as a point on the chart, with its corresponding size and weight.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&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;chart:ScatterSeries&lt;/span&gt; &lt;span class="na"&gt;XBindingPath=&lt;/span&gt;&lt;span class="s"&gt;"Weight"&lt;/span&gt;
                     &lt;span class="na"&gt;YBindingPath=&lt;/span&gt;&lt;span class="s"&gt;"Size"&lt;/span&gt; 
                     &lt;span class="na"&gt;ItemsSource=&lt;/span&gt;&lt;span class="s"&gt;"{Binding SportsBallData}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/chart:ScatterSeries&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We’ve bound the &lt;strong&gt;SportsBallData&lt;/strong&gt; collection from the &lt;strong&gt;SportsBallViewModel&lt;/strong&gt; to the &lt;strong&gt;ItemSource&lt;/strong&gt; property. The &lt;strong&gt;XBindingPath&lt;/strong&gt; and &lt;strong&gt;YBindingPath&lt;/strong&gt; properties are bound to the &lt;strong&gt;Weight&lt;/strong&gt; and &lt;strong&gt;Size&lt;/strong&gt; properties.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Customize the .NET MAUI Scatter Chart appearance
&lt;/h2&gt;

&lt;p&gt;Let’s customize the appearance of the Syncfusion .NET MAUI Scatter Chart to enhance its readability.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding the chart title
&lt;/h3&gt;

&lt;p&gt;Adding a &lt;a href="https://help.syncfusion.com/maui/cartesian-charts/appearance" rel="noopener noreferrer"&gt;title&lt;/a&gt; to the chart enhances its readability and aids users in understanding its content more effectively. By providing a clear and descriptive title, users can quickly grasp the purpose and context of the chart, making it more accessible and informative.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&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;chart:SfCartesianChart.Title&amp;gt;&lt;/span&gt; 
 &lt;span class="nt"&gt;&amp;lt;Grid&amp;gt;&lt;/span&gt; 
  &lt;span class="nt"&gt;&amp;lt;Grid.RowDefinitions&amp;gt;&lt;/span&gt; 
   &lt;span class="nt"&gt;&amp;lt;RowDefinition&lt;/span&gt; &lt;span class="na"&gt;Height=&lt;/span&gt;&lt;span class="s"&gt;"{OnPlatform Android=68,Default=80,iOS=68}"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt; 
  &lt;span class="nt"&gt;&amp;lt;/Grid.RowDefinitions&amp;gt;&lt;/span&gt; 
  &lt;span class="nt"&gt;&amp;lt;Grid.ColumnDefinitions&amp;gt;&lt;/span&gt; 
   &lt;span class="nt"&gt;&amp;lt;ColumnDefinition&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;"55"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt; 
   &lt;span class="nt"&gt;&amp;lt;ColumnDefinition&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;"Auto"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt; 
  &lt;span class="nt"&gt;&amp;lt;/Grid.ColumnDefinitions&amp;gt;&lt;/span&gt; 
  &lt;span class="nt"&gt;&amp;lt;Image&lt;/span&gt; &lt;span class="na"&gt;Grid.Column=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt;  
         &lt;span class="na"&gt;Grid.RowSpan=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt; 
         &lt;span class="na"&gt;Source=&lt;/span&gt;&lt;span class="s"&gt;"balls_sports.png"&lt;/span&gt; 
         &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;"0,-25,0,0"&lt;/span&gt; 
         &lt;span class="na"&gt;HeightRequest=&lt;/span&gt;&lt;span class="s"&gt;"70"&lt;/span&gt; 
         &lt;span class="na"&gt;WidthRequest=&lt;/span&gt;&lt;span class="s"&gt;"50"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt; 
  &lt;span class="nt"&gt;&amp;lt;StackLayout&lt;/span&gt; &lt;span class="na"&gt;Grid.Column=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; 
               &lt;span class="na"&gt;Grid.Row=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; 
               &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;"7,7,0,0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; 
   &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Exploring Ball Sizes and Weights Across Different Sports"&lt;/span&gt;     
          &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"{OnPlatform Android=12,Default=16,iOS=12}"&lt;/span&gt;                     
          &lt;span class="na"&gt;FontAttributes=&lt;/span&gt;&lt;span class="s"&gt;"Bold"&lt;/span&gt; 
          &lt;span class="na"&gt;TextColor=&lt;/span&gt;&lt;span class="s"&gt;"Black"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt; 
   &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"A Comparative Analysis Across Different Sports Ball Sizes and Weights"&lt;/span&gt;  
          &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"{OnPlatform Android=10,Default=12,iOS=10}"&lt;/span&gt;     
          &lt;span class="na"&gt;TextColor=&lt;/span&gt;&lt;span class="s"&gt;"Black"&lt;/span&gt; 
          &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;"0,2,0,0"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt; 
  &lt;span class="nt"&gt;&amp;lt;/StackLayout&amp;gt;&lt;/span&gt; 
 &lt;span class="nt"&gt;&amp;lt;/Grid&amp;gt;&lt;/span&gt; 
&lt;span class="nt"&gt;&amp;lt;/chart:SfCartesianChart.Title&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Customize the axes
&lt;/h3&gt;

&lt;p&gt;Let’s customize the X- and Y-axes with the &lt;a href="https://help.syncfusion.com/cr/maui/Syncfusion.Maui.Charts.LogarithmicAxis.html#Syncfusion_Maui_Charts_LogarithmicAxis_Minimum" rel="noopener noreferrer"&gt;Minimum&lt;/a&gt;, &lt;a href="https://help.syncfusion.com/cr/maui/Syncfusion.Maui.Charts.LogarithmicAxis.html#Syncfusion_Maui_Charts_LogarithmicAxis_Maximum" rel="noopener noreferrer"&gt;Maximum&lt;/a&gt;, &lt;a href="https://help.syncfusion.com/cr/maui/Syncfusion.Maui.Charts.ChartAxis.html#Syncfusion_Maui_Charts_ChartAxis_EdgeLabelsDrawingMode" rel="noopener noreferrer"&gt;EdgeLabelsDrawingMode&lt;/a&gt;, and &lt;a href="https://help.syncfusion.com/cr/maui/Syncfusion.Maui.Charts.ChartAxis.html#Syncfusion_Maui_Charts_ChartAxis_ShowMajorGridLines" rel="noopener noreferrer"&gt;ShowMajorGridLines&lt;/a&gt; properties and the axis Title, LineStyle, and TickStyle properties.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&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;chart:SfCartesianChart.XAxes&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;chart:NumericalAxis&lt;/span&gt; &lt;span class="na"&gt;ShowMajorGridLines=&lt;/span&gt;&lt;span class="s"&gt;”True”&lt;/span&gt;
                      &lt;span class="na"&gt;Maximum=&lt;/span&gt;&lt;span class="s"&gt;”700”&lt;/span&gt;
                      &lt;span class="na"&gt;Interval=&lt;/span&gt;&lt;span class="s"&gt;”100”&lt;/span&gt; 
                      &lt;span class="na"&gt;EdgeLabelsDrawingMode=&lt;/span&gt;&lt;span class="s"&gt;”Shift”&lt;/span&gt;
                      &lt;span class="na"&gt;RangePadding=&lt;/span&gt;&lt;span class="s"&gt;”Additional”&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;chart:NumericalAxis.MajorTickStyle&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;chart:ChartAxisTickStyle&lt;/span&gt; &lt;span class="na"&gt;Stroke=&lt;/span&gt;&lt;span class="s"&gt;”Black”/&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/chart:NumericalAxis.MajorTickStyle&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;chart:NumericalAxis.AxisLineStyle&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;chart:ChartLineStyle&lt;/span&gt; &lt;span class="na"&gt;Stroke=&lt;/span&gt;&lt;span class="s"&gt;”Black”/&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/chart:NumericalAxis.AxisLineStyle&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;chart:NumericalAxis.Title&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;chart:ChartAxisTitle&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;”Weight&lt;/span&gt; &lt;span class="err"&gt;in&lt;/span&gt; &lt;span class="err"&gt;Gram”&lt;/span&gt; &lt;span class="na"&gt;TextColor=&lt;/span&gt;&lt;span class="s"&gt;”Black”/&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/chart:NumericalAxis.Title&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/chart:NumericalAxis&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/chart:SfCartesianChart.Xaxes&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;chart:SfCartesianChart.Yaxes&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;chart:NumericalAxis&lt;/span&gt; &lt;span class="na"&gt;EdgeLabelsDrawingMode=&lt;/span&gt;&lt;span class="s"&gt;”Center”&lt;/span&gt;
                       &lt;span class="na"&gt;Maximum=&lt;/span&gt;&lt;span class="s"&gt;”31”&lt;/span&gt;
                       &lt;span class="na"&gt;Minimum=&lt;/span&gt;&lt;span class="s"&gt;”0”&lt;/span&gt;
                       &lt;span class="na"&gt;Interval=&lt;/span&gt;&lt;span class="s"&gt;”5”&lt;/span&gt;
                       &lt;span class="na"&gt;ShowMajorGridLines=&lt;/span&gt;&lt;span class="s"&gt;”False”&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;chart:NumericalAxis.MajorTickStyle&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;chart:ChartAxisTickStyle&lt;/span&gt; &lt;span class="na"&gt;Stroke=&lt;/span&gt;&lt;span class="s"&gt;”Black”/&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/chart:NumericalAxis.MajorTickStyle&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;chart:NumericalAxis.AxisLineStyle&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;chart:ChartLineStyle&lt;/span&gt; &lt;span class="na"&gt;Stroke=&lt;/span&gt;&lt;span class="s"&gt;”Black”/&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/chart:NumericalAxis.AxisLineStyle&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;chart:NumericalAxis.Title&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;chart:ChartAxisTitle&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;”Size&lt;/span&gt; &lt;span class="err"&gt;in&lt;/span&gt; &lt;span class="err"&gt;Centimeter”&lt;/span&gt; &lt;span class="na"&gt;Stroke=&lt;/span&gt;&lt;span class="s"&gt;”Black”/&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/chart:NumericalAxis.Title&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/chart:NumericalAxis&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/chart:SfCartesianChart.Yaxes&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Customizing the Scatter series
&lt;/h3&gt;

&lt;p&gt;Here, we will enhance the series appearance using the &lt;a href="https://help.syncfusion.com/cr/maui/Syncfusion.Maui.Charts.ChartSeries.html#Syncfusion_Maui_Charts_ChartSeries_PaletteBrushes" rel="noopener noreferrer"&gt;PaletteBrushes&lt;/a&gt;, &lt;a href="https://help.syncfusion.com/cr/maui/Syncfusion.Maui.Charts.ScatterSeries.html#Syncfusion_Maui_Charts_ScatterSeries_PointHeight" rel="noopener noreferrer"&gt;PointHeight&lt;/a&gt;, and &lt;a href="https://help.syncfusion.com/cr/maui/Syncfusion.Maui.Charts.ScatterSeries.html#Syncfusion_Maui_Charts_ScatterSeries_PointWidth" rel="noopener noreferrer"&gt;PointWidth&lt;/a&gt; properties.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&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;chart:ScatterSeries&lt;/span&gt; &lt;span class="na"&gt;PaletteBrushes=&lt;/span&gt;&lt;span class="s"&gt;"{Binding PaletteBrushes}"&lt;/span&gt;
                     &lt;span class="na"&gt;PointHeight=&lt;/span&gt;&lt;span class="s"&gt;"20"&lt;/span&gt; 
                     &lt;span class="na"&gt;PointWidth=&lt;/span&gt;&lt;span class="s"&gt;"20"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/chart:ScatterSeries&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Adding interactivity to the chart
&lt;/h3&gt;

&lt;p&gt;Now, enable tooltips in the scatter series to enhance data visualization and provide additional insights. Customize the tooltip content to display relevant information, such as the name, size, and weight of a sports ball, that improves user experience by offering immediate, context-specific information and deeper data insights using the &lt;a href="https://help.syncfusion.com/cr/maui/Syncfusion.Maui.Charts.ChartSeries.html#Syncfusion_Maui_Charts_ChartSeries_TooltipTemplate" rel="noopener noreferrer"&gt;TooltipTemplate&lt;/a&gt; property.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&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;chart:ScatterSeries.TooltipTemplate&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;DataTemplate&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Grid&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;Grid.RowDefinitions&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;RowDefinition&lt;/span&gt; &lt;span class="na"&gt;Height=&lt;/span&gt;&lt;span class="s"&gt;”Auto”/&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;RowDefinition&lt;/span&gt; &lt;span class="na"&gt;Height=&lt;/span&gt;&lt;span class="s"&gt;”Auto”/&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;RowDefinition&lt;/span&gt; &lt;span class="na"&gt;Height=&lt;/span&gt;&lt;span class="s"&gt;”Auto”/&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/Grid.RowDefinitions&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;Grid.ColumnDefinitions&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ColumnDefinition&lt;/span&gt; &lt;span class="na"&gt;Width=&lt;/span&gt;&lt;span class="s"&gt;”Auto”/&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/Grid.ColumnDefinitions&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Grid.Row=&lt;/span&gt;&lt;span class="s"&gt;”0”&lt;/span&gt; 
          &lt;span class="na"&gt;Grid.Column=&lt;/span&gt;&lt;span class="s"&gt;”0”&lt;/span&gt; &lt;span class="na"&gt;LineBreakMode=&lt;/span&gt;&lt;span class="s"&gt;”WordWrap”&lt;/span&gt;  
          &lt;span class="na"&gt;MaximumWidthRequest=&lt;/span&gt;&lt;span class="s"&gt;”100”&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;”{Binding&lt;/span&gt;  
          &lt;span class="err"&gt;Item.Name,&lt;/span&gt;&lt;span class="na"&gt;StringFormat=&lt;/span&gt;&lt;span class="s"&gt;’{0}’}”&lt;/span&gt;   
          &lt;span class="na"&gt;HorizontalTextAlignment=&lt;/span&gt; &lt;span class="s"&gt;»Center&lt;/span&gt; &lt;span class="err"&gt;»&lt;/span&gt; &lt;span class="na"&gt;HorizontalOptions=&lt;/span&gt; &lt;span class="s"&gt;»Center&lt;/span&gt; &lt;span class="err"&gt;»&lt;/span&gt;  
          &lt;span class="na"&gt;VerticalTextAlignment=&lt;/span&gt; &lt;span class="s"&gt;»Center&lt;/span&gt; &lt;span class="err"&gt;»&lt;/span&gt; &lt;span class="na"&gt;FontAttributes=&lt;/span&gt; &lt;span class="s"&gt;»Bold&lt;/span&gt; &lt;span class="err"&gt;»&lt;/span&gt;  
          &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;”0,3,0,3”&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;”13.5”&lt;/span&gt; &lt;span class="na"&gt;TextColor=&lt;/span&gt;&lt;span class="s"&gt;”White”/&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;BoxView&lt;/span&gt; &lt;span class="na"&gt;Grid.Row=&lt;/span&gt;&lt;span class="s"&gt;”1”&lt;/span&gt; &lt;span class="na"&gt;Grid.Column=&lt;/span&gt;&lt;span class="s"&gt;”0”&lt;/span&gt; &lt;span class="na"&gt;VerticalOptions=&lt;/span&gt;&lt;span class="s"&gt;”Center”&lt;/span&gt; &lt;span class="na"&gt;Color=&lt;/span&gt;&lt;span class="s"&gt;”White”&lt;/span&gt; &lt;span class="na"&gt;HeightRequest=&lt;/span&gt;&lt;span class="s"&gt;”1”&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;StackLayout&lt;/span&gt; &lt;span class="na"&gt;Grid.Row=&lt;/span&gt;&lt;span class="s"&gt;”2”&lt;/span&gt; &lt;span class="na"&gt;Grid.Column=&lt;/span&gt;&lt;span class="s"&gt;”0”&lt;/span&gt; &lt;span class="na"&gt;Orientation=&lt;/span&gt;&lt;span class="s"&gt;”Vertical”&lt;/span&gt; &lt;span class="na"&gt;VerticalOptions=&lt;/span&gt;&lt;span class="s"&gt;”Fill”&lt;/span&gt; &lt;span class="na"&gt;Spacing=&lt;/span&gt;&lt;span class="s"&gt;”0”&lt;/span&gt; &lt;span class="na"&gt;Padding=&lt;/span&gt;&lt;span class="s"&gt;”3”&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;”0”&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;”{Binding&lt;/span&gt; &lt;span class="err"&gt;Item.Weight,&lt;/span&gt;&lt;span class="na"&gt;StringFormat=&lt;/span&gt;&lt;span class="s"&gt;’Weight&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="err"&gt;{0}&lt;/span&gt; &lt;span class="err"&gt;g’}”&lt;/span&gt; 
           &lt;span class="na"&gt;VerticalTextAlignment=&lt;/span&gt;&lt;span class="s"&gt;”Center”&lt;/span&gt;
           &lt;span class="na"&gt;HorizontalOptions=&lt;/span&gt;&lt;span class="s"&gt;”Start”&lt;/span&gt;
           &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;”0,0,3,0”&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;”13.5”&lt;/span&gt; &lt;span class="na"&gt;TextColor=&lt;/span&gt;&lt;span class="s"&gt;”White”/&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;”{Binding&lt;/span&gt; &lt;span class="err"&gt;Item.Size,&lt;/span&gt;&lt;span class="na"&gt;StringFormat=&lt;/span&gt;&lt;span class="s"&gt;’Size&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="err"&gt;{0}&lt;/span&gt; &lt;span class="err"&gt;cm’}”&lt;/span&gt; 
           &lt;span class="na"&gt;VerticalTextAlignment=&lt;/span&gt;&lt;span class="s"&gt;”Center”&lt;/span&gt;
           &lt;span class="na"&gt;HorizontalOptions=&lt;/span&gt;&lt;span class="s"&gt;”Start”&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;”0,0,3,0”&lt;/span&gt;
           &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;”12”&lt;/span&gt; &lt;span class="na"&gt;TextColor=&lt;/span&gt;&lt;span class="s"&gt;”White”/&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/StackLayout&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Grid&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/DataTemplate&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/chart:ScatterSeries.TooltipTemplate&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After executing these code examples, we will get the output that resembles the following image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2024%2F06%2FVisualizing-different-sports-ball-sizes-and-weights-using-the-.NET-MAUI-Scatter-Chart.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2024%2F06%2FVisualizing-different-sports-ball-sizes-and-weights-using-the-.NET-MAUI-Scatter-Chart.gif" alt="Visualizing different sports ball sizes and weights using the .NET MAUI Scatter Chart"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Visualizing different sports ball sizes and weights using the .NET MAUI Scatter Chart&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub reference
&lt;/h2&gt;

&lt;p&gt;Use the .NET MAUI Scatter Chart &lt;a href="https://github.com/SyncfusionExamples/Creating-a-Bubble-Chart-to-Explore-Ball-Sizes-and-Weights-Across-Different-Sports/tree/Task-889684_scatter_blog_sample_for_.Net_Maui" rel="noopener noreferrer"&gt;GitHub demo&lt;/a&gt; to visualize different sports ball sizes and weights for more details.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Thanks for reading! In this blog, we’ve seen how to use the Syncfusion &lt;a href="https://help.syncfusion.com/maui/cartesian-charts/scatter" rel="noopener noreferrer"&gt;MAUI Scatter chart&lt;/a&gt; to visualize the different sports ball sizes and weights. We strongly encourage you to follow the steps outlined in this blog and share your thoughts in the comments below.&lt;/p&gt;

&lt;p&gt;The existing customers can download the new version of Essential Studio on the &lt;a href="https://www.syncfusion.com/account" rel="noopener noreferrer"&gt;License and Downloads&lt;/a&gt; page. If you are not a Syncfusion customer, try our 30-day &lt;a href="https://www.syncfusion.com/downloads" rel="noopener noreferrer"&gt;free trial&lt;/a&gt; to check out our incredible features. &lt;/p&gt;

&lt;p&gt;You can also contact us through our &lt;a href="https://www.syncfusion.com/forums" rel="noopener noreferrer"&gt;support forums&lt;/a&gt;, &lt;a href="https://support.syncfusion.com/" rel="noopener noreferrer"&gt;support portal&lt;/a&gt;, or &lt;a href="https://www.syncfusion.com/feedback" rel="noopener noreferrer"&gt;feedback portal&lt;/a&gt;. We are always happy to assist you!&lt;/p&gt;

&lt;h2&gt;
  
  
  Related blogs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/dotnetmaui-digital-gauge-control" rel="noopener noreferrer"&gt;Introducing the New .NET MAUI Digital Gauge Control&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/syncfusion-dotnet-maui-2024-volume-2" rel="noopener noreferrer"&gt;Introducing the 12th Set of New .NET MAUI Controls and Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/microsoft-build-2024-syncfusion-recap" rel="noopener noreferrer"&gt;Microsoft Build 2024: The Syncfusion Experience&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/dotnet-maui-charts-2024-volume-2" rel="noopener noreferrer"&gt;What’s New in .NET MAUI Charts: 2024 Volume 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>dotnetmaui</category>
      <category>chart</category>
      <category>maui</category>
      <category>mobile</category>
    </item>
    <item>
      <title>How to Maintain State in the Blazor ListBox Using Fluxor?</title>
      <dc:creator>Gayathri-github7</dc:creator>
      <pubDate>Wed, 19 Jun 2024 11:32:22 +0000</pubDate>
      <link>https://dev.to/syncfusion/how-to-maintain-state-in-the-blazor-listbox-using-fluxor-je1</link>
      <guid>https://dev.to/syncfusion/how-to-maintain-state-in-the-blazor-listbox-using-fluxor-je1</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Learn how to maintain state in the Syncfusion Blazor ListBox using the Fluxor state management library. This guide covers setting up Fluxor, integrating it with the ListBox, and managing selected items for a smooth user experience. &lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Syncfusion&lt;/strong&gt; &lt;a href="https://www.syncfusion.com/blazor-components/blazor-listbox" rel="noopener noreferrer"&gt;Blaz&lt;/a&gt;&lt;a href="https://www.syncfusion.com/blazor-components/blazor-listbox" rel="noopener noreferrer"&gt;or&lt;/a&gt;&lt;a href="https://www.syncfusion.com/blazor-components/blazor-listbox" rel="noopener noreferrer"&gt;ListBox&lt;/a&gt; is a feature-rich component that provides excellent functionalities rather than just displaying a list of items. It allows users to select one or more items using check boxes, with a mouse, or through keyboard interactions. It can be populated using an array of strings or objects.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://fluxor.dev/" rel="noopener noreferrer"&gt;Fluxor&lt;/a&gt; is a state management library heavily inspired by the Flux architecture and popularized by Facebook’s React library. It provides a predictable and efficient way to manage your app’s state by enforcing unidirectional data flow and promoting a reactive programming style.&lt;/p&gt;

&lt;p&gt;In this blog, we’ll learn how to maintain the state in the Syncfusion Blazor ListBox using Fluxor. We’ll store the selected items (current state) of the ListBox, i.e., the selected item values, in the Fluxor. Then, we’ll load the values from the Fluxor and display them at the end of the ListBox while scrolling through a huge volume of items. This will provide a smooth navigation and user experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started with Blazor ListBox
&lt;/h2&gt;

&lt;p&gt;First, refer to the &lt;a href="https://blazor.syncfusion.com/documentation/listbox/getting-started" rel="noopener noreferrer"&gt;getting started with Blazor ListBox component documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now, refer to the following code example demonstrating how to render a ListBox component in a Razor page.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;@using Syncfusion.Blazor.DropDowns

&lt;span class="nt"&gt;&amp;lt;SfListBox&lt;/span&gt; &lt;span class="na"&gt;TValue=&lt;/span&gt;&lt;span class="s"&gt;"string[]"&lt;/span&gt; &lt;span class="na"&gt;DataSource=&lt;/span&gt;&lt;span class="s"&gt;"@Vehicles"&lt;/span&gt; &lt;span class="na"&gt;TItem=&lt;/span&gt;&lt;span class="s"&gt;"VehicleData"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;ListBoxFieldSettings&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Text"&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;"Id"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/SfListBox&amp;gt;&lt;/span&gt;
@code {
    public string[] value = new string[] { “Vehicle-01” };
    public List&lt;span class="nt"&gt;&amp;lt;VehicleData&amp;gt;&lt;/span&gt; Vehicles = new List&lt;span class="nt"&gt;&amp;lt;VehicleData&amp;gt;&lt;/span&gt; {
        new VehicleData { Text = "Hennessey Venom", Id = "Vehicle-01" },
        new VehicleData { Text = "Bugatti Chiron", Id = "Vehicle-02" },
        new VehicleData { Text = "Bugatti Veyron Super Sport", Id = "Vehicle-03" }
    };

    public class VehicleData {
      public string Text { get; set; }
      public string Id { get; set; }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Getting started with Fluxor
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/mrpmorris/Fluxor" rel="noopener noreferrer"&gt;Fluxor&lt;/a&gt; helps you manage the state of your app in a predictable and organized manner. Follow these steps to get started with it:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Installation
&lt;/h3&gt;

&lt;p&gt;To add the &lt;a href="https://www.nuget.org/packages/Fluxor.Blazor.Web" rel="noopener noreferrer"&gt;Fluxor NuGet package&lt;/a&gt; to your Blazor server project, use the following command in the Package Manager Console window.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Install-Package Fluxor.Blazor.Web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Register the store
&lt;/h3&gt;

&lt;p&gt;Add the following code to your &lt;strong&gt;App.razor&lt;/strong&gt; file. This code is an essential setup for Fluxor state management in your Blazor app. It initializes the Fluxor store and ensures your app can manage state and actions effectively.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Fluxor.Blazor.Web.StoreInitializer /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Register the Fluxor
&lt;/h3&gt;

&lt;p&gt;To integrate Fluxor into your Blazor app, navigate to the &lt;strong&gt;Program.cs&lt;/strong&gt; file. Inside the Main method, add the following code to register Fluxor.&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;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;AddFluxor&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;ScanAssemblies&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Program&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="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This registration ensures Fluxor is properly integrated, allowing efficient state management throughout your app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Set up the feature/state
&lt;/h3&gt;

&lt;p&gt;Now, create a &lt;strong&gt;Store&lt;/strong&gt; folder within your project, and inside it, create a subfolder named &lt;strong&gt;ValueUseCase&lt;/strong&gt;. Add a new class called &lt;strong&gt;ValueState.cs&lt;/strong&gt; within this subfolder.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&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;Fluxor&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;SyncfusionBlazorApp.Store.ValueUseCase&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;FeatureState&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;record&lt;/span&gt; &lt;span class="nc"&gt;ValueState&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;Items&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="nf"&gt;ValueState&lt;/span&gt;&lt;span class="p"&gt;()&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="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; 
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;//default constructor&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;
  
  
  Step 5: Defining actions
&lt;/h3&gt;

&lt;p&gt;Create an action class named &lt;strong&gt;SetValueAction&lt;/strong&gt; to update items from the  Blazor ListBox in the &lt;strong&gt;Store&lt;/strong&gt; folder. In the following code example, we’ll define the following two records within the &lt;strong&gt;SyncfusionBlazorApp.Store&lt;/strong&gt; namespace. These records are used to manage actions and states within a Blazor app.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;EventValueClicked:&lt;/strong&gt; It accepts an array of strings, likely conveying a list of items or values, and it is typically dispatched to trigger state updates within a state management system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SetValueAction:&lt;/strong&gt; It also takes an array of strings as its input parameter and updates the application’s state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Refer to the following code example.&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;SyncfusionBlazorApp.Store.ValueUseCase&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;SyncfusionBlazorApp.Store&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;record&lt;/span&gt; &lt;span class="nc"&gt;EventValueClicked&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;Items&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;record&lt;/span&gt; &lt;span class="nc"&gt;SetValueAction&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;Items&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;
  
  
  Step 6: Defining reducers
&lt;/h3&gt;

&lt;p&gt;To manage state changes effectively in a Fluxor-based app, create a &lt;strong&gt;Reducer.cs&lt;/strong&gt; class within the &lt;strong&gt;ValueUseCase&lt;/strong&gt; folder. This class will contain &lt;strong&gt;ReduceSetValueItem,&lt;/strong&gt; specifically designed to handle state changes when the &lt;strong&gt;SetValueAction&lt;/strong&gt; is dispatched.&lt;/p&gt;

&lt;p&gt;Refer to the following code example. When the &lt;strong&gt;SetValueAction&lt;/strong&gt; is triggered, the &lt;strong&gt;ReduceSetValueItem&lt;/strong&gt; method generates a new state object. This new state object’s &lt;strong&gt;Items&lt;/strong&gt; property is updated with the values provided in the action. This process ensures that the state is kept up to date in a predictable and immutable manner, following a common pattern in Fluxor-based state management.&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;Fluxor&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;SyncfusionBlazorApp.Store.ValueUseCase&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;Reducers&lt;/span&gt; 
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ReducerMethod&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;static&lt;/span&gt; &lt;span class="n"&gt;ValueState&lt;/span&gt; &lt;span class="nf"&gt;ReduceSetValueItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ValueState&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SetValueAction&lt;/span&gt; &lt;span class="n"&gt;action&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="n"&gt;state&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Items&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Items&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;h3&gt;
  
  
  Step 7 Defining effects
&lt;/h3&gt;

&lt;p&gt;In the &lt;strong&gt;ValueUseCase&lt;/strong&gt; folder, let’s create an &lt;strong&gt;Effects.cs&lt;/strong&gt; class to handle effects. Within this class, we’ll define the &lt;strong&gt;HandleEventCounterClicked&lt;/strong&gt; method, which listens for &lt;strong&gt;EventValueClicked&lt;/strong&gt; actions. Upon detection, it dispatches a &lt;strong&gt;SetValueAction&lt;/strong&gt; to update the application’s state potentially.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&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;Fluxor&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;SyncfusionBlazorApp.Store.ValueUseCase&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;Effects&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;IState&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ValueState&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_valueState&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Effects&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IState&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ValueState&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;valueState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;_valueState&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;valueState&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="n"&gt;EffectMethod&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;Task&lt;/span&gt; &lt;span class="nf"&gt;HandleEventCounterClicked&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;EventValueClicked&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IDispatcher&lt;/span&gt; &lt;span class="n"&gt;dispatcher&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;dispatcher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Dispatch&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;SetValueAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Items&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="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;
  
  
  Step 8: Integrate Fluxor in the Blazor ListBox component
&lt;/h3&gt;

&lt;p&gt;Now, connect the &lt;strong&gt;Fluxor&lt;/strong&gt; state to your ListBox component’s &lt;strong&gt;Value&lt;/strong&gt; property. Then, trigger the dispatch of the &lt;strong&gt;SetItemsAction&lt;/strong&gt; within the &lt;strong&gt;ValueChange&lt;/strong&gt; event of the ListBox.&lt;/p&gt;

&lt;p&gt;This ensures that whenever there is a change in the selection of the ListBox, an update is automatically initiated in the Fluxor state, guaranteeing synchronization between the UI and the application state.&lt;/p&gt;

&lt;p&gt;Refer to the following code example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;@page "/"
@using Syncfusion.Blazor.DropDowns
@using Fluxor
@using SyncfusionBlazorApp.Store;
@using SyncfusionBlazorApp.Store.ValueUseCase
&lt;span class="nt"&gt;&amp;lt;SfListBox&lt;/span&gt; &lt;span class="na"&gt;TValue=&lt;/span&gt;&lt;span class="s"&gt;"string[]"&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;"@valueState.Value.Items"&lt;/span&gt; &lt;span class="na"&gt;DataSource=&lt;/span&gt;&lt;span class="s"&gt;"@Vehicles"&lt;/span&gt; &lt;span class="na"&gt;TItem=&lt;/span&gt;&lt;span class="s"&gt;"VehicleData"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;ListBoxFieldSettings&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Text"&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;"Id"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;ListBoxEvents&lt;/span&gt; &lt;span class="na"&gt;TValue=&lt;/span&gt;&lt;span class="s"&gt;"string[]"&lt;/span&gt; &lt;span class="na"&gt;TItem=&lt;/span&gt;&lt;span class="s"&gt;"VehicleData"&lt;/span&gt; &lt;span class="na"&gt;ValueChange=&lt;/span&gt;&lt;span class="s"&gt;"@valueChange"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/ListBoxEvents&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/SfListBox&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;span&amp;gt;&amp;lt;b&amp;gt;&lt;/span&gt;Selected Items&lt;span class="nt"&gt;&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;ol&amp;gt;&lt;/span&gt;
    @foreach (var item in valueState!.Value.Items) 
    {
        &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;@item&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
    }
&lt;span class="nt"&gt;&amp;lt;/ol&amp;gt;&lt;/span&gt;
@code {
    [Inject]
    private IDispatcher? dispatcher { get; set; }
    [Inject]
    protected IState&lt;span class="nt"&gt;&amp;lt;ValueState&amp;gt;&lt;/span&gt;? valueState { get; set; }
    public List&lt;span class="nt"&gt;&amp;lt;VehicleData&amp;gt;&lt;/span&gt; Vehicles = new List&lt;span class="nt"&gt;&amp;lt;VehicleData&amp;gt;&lt;/span&gt; {
        new VehicleData { Text = "Hennessey Venom", Id = "Vehicle-01" },
        new VehicleData { Text = "Bugatti Chiron", Id = "Vehicle-02" },
        new VehicleData { Text = "Bugatti Veyron Sport", Id = "Vehicle-03" },
        new VehicleData { Text = "SSC Ultimate Aero", Id = "Vehicle-04" },
        new VehicleData { Text = "Koenigsegg CCR", Id = "Vehicle-05" },
        new VehicleData { Text = "McLaren F1", Id = "Vehicle-06" },
        new VehicleData { Text = "Aston Martin One- 77", Id = "Vehicle-07" },
        new VehicleData { Text = "Jaguar XJ220", Id = "Vehicle-08" }
    };
    private void valueChange(ListBoxChangeEventArgs&lt;span class="nt"&gt;&amp;lt;string&lt;/span&gt;&lt;span class="err"&gt;[],&lt;/span&gt; &lt;span class="err"&gt;VehicleData&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; args)
    {
        dispatcher?.Dispatch(new EventValueClicked(args.Value));
    }
    public class VehicleData {
        public string Text { get; set; }
        public string Id { get; set; }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After executing the above code examples, we will get the output in the following image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2024%2F06%2FMaintaining-state-in-Blazor-ListBox-component-using-Fluxor.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.syncfusion.com%2Fblogs%2Fwp-content%2Fuploads%2F2024%2F06%2FMaintaining-state-in-Blazor-ListBox-component-using-Fluxor.gif" alt="Maintaining state in Blazor ListBox component using Fluxor"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Maintaining state in Blazor ListBox component using Fluxor&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub reference
&lt;/h2&gt;

&lt;p&gt;For more details, refer to state management in Blazor ListBox using the Fluxor &lt;a href="https://github.com/SyncfusionExamples/how-to-maintain-state-in-the-blazor-listBox-using-fluxor-state" rel="noopener noreferrer"&gt;GitHub demo&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Thanks for reading! In this blog, we’ve seen how to maintain the state in the Syncfusion Blazor &lt;a href="https://www.syncfusion.com/blazor-components/blazor-listbox" rel="noopener noreferrer"&gt;ListBox&lt;/a&gt; component using Fluxor. Try out the steps discussed in this blog, and leave our feedback in the comments section below!&lt;/p&gt;

&lt;p&gt;Our existing customers can download the new version of Essential Studio from the &lt;a href="https://www.syncfusion.com/account" rel="noopener noreferrer"&gt;License and Downloads&lt;/a&gt; page. If you are not a Syncfusion customer, try our 30-day &lt;a href="https://www.syncfusion.com/downloads" rel="noopener noreferrer"&gt;free trial&lt;/a&gt; to check out our incredible features.&lt;/p&gt;

&lt;p&gt;If you have any questions or need assistance, our support team is always here to help. Feel free to contact us through our &lt;a href="https://www.syncfusion.com/forums" rel="noopener noreferrer"&gt;support forum&lt;/a&gt;, &lt;a href="https://support.syncfusion.com/" rel="noopener noreferrer"&gt;support portal&lt;/a&gt;, or &lt;a href="https://www.syncfusion.com/feedback/" rel="noopener noreferrer"&gt;feedback portal&lt;/a&gt;. We look forward to hearing from you!&lt;/p&gt;

&lt;h2&gt;
  
  
  Related blog
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/whats-new-csharp-13-for-developers" rel="noopener noreferrer"&gt;What’s New in C# 13 for Developers?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/syncfusion-essential-studio-2024-vol2" rel="noopener noreferrer"&gt;Syncfusion Essential Studio 2024 Volume 2 Is Here!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/google-authentication-blazor-wasm-app" rel="noopener noreferrer"&gt;Easily Implement Google Authentication in the Blazor WebAssembly App&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/blogs/post/mobile-pdf-annotations-with-blazor" rel="noopener noreferrer"&gt;Pro Annotations on Mobile PDFs with Blazor PDF Viewer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>blazor</category>
      <category>csharp</category>
      <category>development</category>
      <category>web</category>
    </item>
  </channel>
</rss>
