<?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: Oleksandr Liakhevych</title>
    <description>The latest articles on DEV Community by Oleksandr Liakhevych (@dreamescaper).</description>
    <link>https://dev.to/dreamescaper</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%2F928385%2Fd6c76410-ed1a-4926-8ca5-055db798b647.jpeg</url>
      <title>DEV Community: Oleksandr Liakhevych</title>
      <link>https://dev.to/dreamescaper</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dreamescaper"/>
    <language>en</language>
    <item>
      <title>BlazorBindings.Maui v1.0</title>
      <dc:creator>Oleksandr Liakhevych</dc:creator>
      <pubDate>Tue, 07 Mar 2023 22:33:16 +0000</pubDate>
      <link>https://dev.to/dreamescaper/blazorbindingsmaui-v10-50bo</link>
      <guid>https://dev.to/dreamescaper/blazorbindingsmaui-v10-50bo</guid>
      <description>&lt;p&gt;This release is one of the biggest ones so far, and I have decided that &lt;a href="https://github.com/Dreamescaper/BlazorBindings.Maui"&gt;BlazorBindings.Maui&lt;/a&gt; is stable enough for a 1.0 release! Take a look at &lt;a href="https://dreamescaper.github.io/MobileBlazorBindingsDocs/maui-blazor-bindings/get-started.html"&gt;Get Started&lt;/a&gt; page to check it out!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;About this project&lt;/li&gt;
&lt;li&gt;
New controls supported

&lt;ul&gt;
&lt;li&gt;SearchBar&lt;/li&gt;
&lt;li&gt;IndicatorView&lt;/li&gt;
&lt;li&gt;SwipeView&lt;/li&gt;
&lt;li&gt;TableView&lt;/li&gt;
&lt;li&gt;ListView&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Behaviors&lt;/li&gt;
&lt;li&gt;BlazorBindingsApplication&lt;/li&gt;
&lt;li&gt;Root Wrapper&lt;/li&gt;
&lt;li&gt;Error Boundaries&lt;/li&gt;
&lt;li&gt;Entry is generic&lt;/li&gt;
&lt;li&gt;Other changes&lt;/li&gt;
&lt;li&gt;Breaking changes&lt;/li&gt;
&lt;li&gt;What's next?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  About this project
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/Dreamescaper/BlazorBindings.Maui"&gt;This project&lt;/a&gt; is a fork of MobileBlazorBindings - experimental project by Microsoft to allow to use Blazor syntax for native controls instead of XAML with MAUI. Here is a sample Counter component that renders native UI, which may look familiar to Blazor developers, that increments a value on each button press:&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;StackLayout&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"30"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;You pressed @count times &lt;span class="nt"&gt;&amp;lt;/Label&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;"+1"&lt;/span&gt; &lt;span class="na"&gt;OnClick=&lt;/span&gt;&lt;span class="s"&gt;"@HandleClick"&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;

@code {
    int count;

    void HandleClick()
    {
        count++;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://camo.githubusercontent.com/554d00d915708b2059da912c31662b22f3ea93d72431c30e278c3d39d3d02ed9/68747470733a2f2f646576626c6f67732e6d6963726f736f66742e636f6d2f6173706e65742f77702d636f6e74656e742f75706c6f6164732f73697465732f31362f323032302f30312f626c617a6f722d616e64726f69642d636f756e7465722d322e676966" class="article-body-image-wrapper"&gt;&lt;img src="https://camo.githubusercontent.com/554d00d915708b2059da912c31662b22f3ea93d72431c30e278c3d39d3d02ed9/68747470733a2f2f646576626c6f67732e6d6963726f736f66742e636f6d2f6173706e65742f77702d636f6e74656e742f75706c6f6164732f73697465732f31362f323032302f30312f626c617a6f722d616e64726f69642d636f756e7465722d322e676966" alt="Android emulator" width="600" height="1066"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;This update brings the support to five more controls. That alse means that all Maui built-in controls are supported now (however, not all the functionality is supported for some controls yet).&lt;br&gt;
You can take a look at &lt;a href="https://github.com/Dreamescaper/BlazorBindings.Maui/tree/main/samples/ControlGallery"&gt;ControlGallery&lt;/a&gt; sample to find the examples of usage for those (and other) controls.&lt;/p&gt;
&lt;h3&gt;
  
  
  SearchBar
&lt;/h3&gt;

&lt;p&gt;SearchBar is a user input control used to initiating a search.&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;SearchBar&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;bind-Text=&lt;/span&gt;&lt;span class="s"&gt;"_searchQuery"&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;bind-Text:after=&lt;/span&gt;&lt;span class="s"&gt;"UpdateSearchResults"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;CollectionView&lt;/span&gt; &lt;span class="na"&gt;ItemsSource=&lt;/span&gt;&lt;span class="s"&gt;"_displayedItems"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

@code {
    string _searchQuery;
    string[] _displayedItems;

    async Task UpdateSearchResults()
    {
        _displayedItems = await /* retrieve items */;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RakrmNub--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2rx8mex5r9vtc2ie0j9b.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RakrmNub--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2rx8mex5r9vtc2ie0j9b.gif" alt="SearchBar" width="399" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  IndicatorView
&lt;/h3&gt;

&lt;p&gt;IndicatorView is a control that displays indicators that represent the number of items, and current position, in a CarouselView.&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;CarouselView&lt;/span&gt; &lt;span class="na"&gt;IndicatorView=&lt;/span&gt;&lt;span class="s"&gt;"() =&amp;gt; indicatorView"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ItemTemplate&amp;gt;&lt;/span&gt;
        ...
    &lt;span class="nt"&gt;&amp;lt;/ItemTemplate&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/CarouselView&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;IndicatorView&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;"indicatorView"&lt;/span&gt;
               &lt;span class="na"&gt;HorizontalOptions=&lt;/span&gt;&lt;span class="s"&gt;"LayoutOptions.Center"&lt;/span&gt;
               &lt;span class="na"&gt;IndicatorColor=&lt;/span&gt;&lt;span class="s"&gt;"Colors.DarkGray"&lt;/span&gt;
               &lt;span class="na"&gt;SelectedIndicatorColor=&lt;/span&gt;&lt;span class="s"&gt;"Colors.LightGray"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

@code {
    IndicatorView indicatorView;
}

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vo86njP---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w900i6cedpdbzq3cxww2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vo86njP---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w900i6cedpdbzq3cxww2.gif" alt="IndicatorView" width="395" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  SwipeView
&lt;/h3&gt;

&lt;p&gt;SwipeView is a container control that wraps around an item of content, and provides context menu items that are revealed by a swipe gesture.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;@foreach (var item in _items)
{
    &lt;span class="nt"&gt;&amp;lt;SwipeView&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;RightItems&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;SwipeItems&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;SwipeItem&lt;/span&gt; &lt;span class="na"&gt;BackgroundColor=&lt;/span&gt;&lt;span class="s"&gt;"Colors.Yellow"&lt;/span&gt;
                       &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Favorite"&lt;/span&gt;
                       &lt;span class="na"&gt;OnInvoked=&lt;/span&gt;&lt;span class="s"&gt;"() =&amp;gt; MakeFavorite(item)"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

                &lt;span class="nt"&gt;&amp;lt;SwipeItem&lt;/span&gt; &lt;span class="na"&gt;BackgroundColor=&lt;/span&gt;&lt;span class="s"&gt;"Colors.Red"&lt;/span&gt;
                       &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Remove"&lt;/span&gt;
                       &lt;span class="na"&gt;IsDestructive=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;
                       &lt;span class="na"&gt;OnInvoked=&lt;/span&gt;&lt;span class="s"&gt;"() =&amp;gt; Remove(item)"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/SwipeItems&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/RightItems&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;ChildContent&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;ContentView&lt;/span&gt; &lt;span class="na"&gt;BackgroundColor=&lt;/span&gt;&lt;span class="s"&gt;"Colors.Green"&lt;/span&gt; &lt;span class="na"&gt;Padding=&lt;/span&gt;&lt;span class="s"&gt;"8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;Label&amp;gt;&lt;/span&gt;@item&lt;span class="nt"&gt;&amp;lt;/Label&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/ContentView&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/ChildContent&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/SwipeView&amp;gt;&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iBot-FUp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wsl32b15ieioinrufhqw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iBot-FUp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wsl32b15ieioinrufhqw.gif" alt="SwipeView" width="444" height="305"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  TableView
&lt;/h3&gt;

&lt;p&gt;TableView displays a table of scrollable items that can be grouped into sections. A TableView is typically used for displaying items where each row has a different appearance, such as presenting a table of settings.&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;TableView&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;TableRoot&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;TableSection&lt;/span&gt; &lt;span class="na"&gt;Title=&lt;/span&gt;&lt;span class="s"&gt;"Cells examples"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;TextCell&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Click me"&lt;/span&gt; &lt;span class="na"&gt;Detail=&lt;/span&gt;&lt;span class="s"&gt;"Tapping makes something happen."&lt;/span&gt; &lt;span class="na"&gt;OnTapped=&lt;/span&gt;&lt;span class="s"&gt;"OnCellTapped"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;EntryCell&lt;/span&gt; &lt;span class="na"&gt;Label=&lt;/span&gt;&lt;span class="s"&gt;"Enter your name:"&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;bind-Text=&lt;/span&gt;&lt;span class="s"&gt;"entryText"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;SwitchCell&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Click to toggle:"&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;bind-On=&lt;/span&gt;&lt;span class="s"&gt;"switchOn"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/TableSection&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/TableRoot&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/TableView&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--E9_n4xxX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xntp1y3zo6gxwi64kap0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--E9_n4xxX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xntp1y3zo6gxwi64kap0.png" alt="TableView" width="441" height="224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ListView
&lt;/h3&gt;

&lt;p&gt;ListView displays a scrollable vertical list of selectable data items. While ListView manages the appearance of the list, the appearance of each item in the list is defined by a DataTemplate that uses a Cell to display items.&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;ListView&lt;/span&gt; &lt;span class="na"&gt;ItemsSource=&lt;/span&gt;&lt;span class="s"&gt;"items"&lt;/span&gt; &lt;span class="na"&gt;SelectionMode=&lt;/span&gt;&lt;span class="s"&gt;"ListViewSelectionMode.None"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ItemTemplate&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;ImageCell&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"@context.Name"&lt;/span&gt; &lt;span class="na"&gt;Detail=&lt;/span&gt;&lt;span class="s"&gt;"@context.Type"&lt;/span&gt; &lt;span class="na"&gt;ImageSource=&lt;/span&gt;&lt;span class="s"&gt;"@context.ImageUrl"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;ContextActions&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;MenuItem&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Remove"&lt;/span&gt; &lt;span class="na"&gt;IsDestructive=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;OnClick=&lt;/span&gt;&lt;span class="s"&gt;"() =&amp;gt; RemoveItem(context)"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/ContextActions&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/ImageCell&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/ItemTemplate&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ListView&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XbWYZJLa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6qb76er7rksx8uol5gch.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XbWYZJLa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6qb76er7rksx8uol5gch.png" alt="ListView" width="443" height="692"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Behaviors
&lt;/h2&gt;

&lt;p&gt;While Behaviors concept is a bit foreign with Blazor, it is an important part of the Maui ecosystem, therefore this update brings the support for Behaviors. While there are no Behavior components provided out of the box, you can create bindings for the behaviors that you need using &lt;a href="//../advanced/custom-components.md#wrapping-maui-components"&gt;component generator&lt;/a&gt;.&lt;br&gt;
Here's the example for &lt;a href="https://learn.microsoft.com/en-us/dotnet/communitytoolkit/maui/behaviors/statusbar-behavior"&gt;StatusBarBehavior&lt;/a&gt; from the MAUI Community Toolkit (you can take a look at the full sample &lt;a href="https://github.com/Dreamescaper/BlazorBindings.Maui/tree/main/samples/ThirdPartyControlsSample"&gt;here&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;ContentPage&lt;/span&gt; &lt;span class="na"&gt;Title=&lt;/span&gt;&lt;span class="s"&gt;"CommunityToolkit.Behaviors"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Behaviors&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;StatusBarBehavior&lt;/span&gt; &lt;span class="na"&gt;StatusBarColor=&lt;/span&gt;&lt;span class="s"&gt;"Colors.Green"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Behaviors&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--C03jjWjc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qpr3czz2pkncju00nbqw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--C03jjWjc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qpr3czz2pkncju00nbqw.png" alt="Behavior" width="441" height="99"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  BlazorBindingsApplication
&lt;/h2&gt;

&lt;p&gt;Previously, you had to use &lt;code&gt;MauiBlazorBindingsRenderer&lt;/code&gt; instance to add BlazorBindings component to your application. However, &lt;code&gt;MauiBlazorBindingsRenderer&lt;/code&gt; is not recommended to be used from the application code, as it is a low level implementation detail.&lt;br&gt;
This release brings an easy to use &lt;code&gt;BlazorBindingsApplication&lt;/code&gt; type, which accept your root component type as a generic argument.&lt;/p&gt;

&lt;p&gt;You can inherit your App type from BlazorBindingsApplication, if you need to customize the Application in any way:&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;App&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BlazorBindingsApplication&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;AppShell&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;public&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IServiceProvider&lt;/span&gt; &lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;base&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="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Do whatever you need (e.g. add resources).&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;Or you can use this type directly in simple cases:&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;UseMauiApp&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;BlazorBindingsApplication&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;AppShell&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Root Wrapper
&lt;/h2&gt;

&lt;p&gt;Generally, BlazorBindings' renderer creates separate render trees for each page - that includes MainPage and navigations (both regular and modals). However, in some cases it might be useful to have a component, which wraps any rendered subtree - e.g. to define global cascading parameters, or to update all the pages on some theme changed.&lt;/p&gt;

&lt;p&gt;Now it is possible to do that via &lt;code&gt;BlazorBindingsApplication&lt;/code&gt;'s &lt;code&gt;WrapperComponentType&lt;/code&gt; property. &lt;/p&gt;

&lt;p&gt;For instance, here's an example of a wrapping component &lt;code&gt;Root.razor&lt;/code&gt;, which adds a global cascading value, and updates the UI based on some event:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;@inject AppState AppState

&lt;span class="nt"&gt;&amp;lt;CascadingValue&lt;/span&gt; &lt;span class="na"&gt;Value=&lt;/span&gt;&lt;span class="s"&gt;"123"&lt;/span&gt; &lt;span class="na"&gt;Name=&lt;/span&gt;&lt;span class="s"&gt;"test"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    @ChildContent
&lt;span class="nt"&gt;&amp;lt;/CascadingValue&amp;gt;&lt;/span&gt;

@code {
    [Parameter] public RenderFragment ChildContent { get; set; }

    protected override void OnInitialized() 
    {
        AppState.ThemeChanged += InvokeAsync(() =&amp;gt; StateHasChanged());
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, it is set as a wrapper component by overriding &lt;code&gt;WrapperComponentType&lt;/code&gt; property:&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;App&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BlazorBindingsApplication&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;AppShell&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;public&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IServiceProvider&lt;/span&gt; &lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;base&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="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;override&lt;/span&gt; &lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="n"&gt;WrapperComponentType&lt;/span&gt; &lt;span class="p"&gt;=&amp;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;Root&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;
  
  
  Error Boundaries
&lt;/h2&gt;

&lt;p&gt;One of use cases for wrapper components is to allow to set a global &lt;a href="https://learn.microsoft.com/en-us/aspnet/core/blazor/fundamentals/handle-errors?view=aspnetcore-7.0#error-boundaries"&gt;error boundary&lt;/a&gt;. It allows to handle any exception, display a nice error page, and return back to the application (instead of simply crashing the application).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;[!NOTE]&lt;br&gt;
Error boundaries do not allow you to &lt;em&gt;ignore&lt;/em&gt; exceptions based on some conditions, and leave the user on a current page. Error boundary content is &lt;em&gt;always&lt;/em&gt; replaced with an error content if any exception occurs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here's an example of such wrapper component:&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;ErrorBoundary&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;"_errorBoundary"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ChildContent&amp;gt;&lt;/span&gt;
        @ChildContent
    &lt;span class="nt"&gt;&amp;lt;/ChildContent&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;ErrorContent&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;ContentPage&lt;/span&gt; &lt;span class="na"&gt;Title=&lt;/span&gt;&lt;span class="s"&gt;"Error"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;VerticalStackLayout&lt;/span&gt; &lt;span class="na"&gt;Margin=&lt;/span&gt;&lt;span class="s"&gt;"8"&lt;/span&gt; &lt;span class="na"&gt;Spacing=&lt;/span&gt;&lt;span class="s"&gt;"8"&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;"Oops!"&lt;/span&gt; &lt;span class="na"&gt;HorizontalOptions=&lt;/span&gt;&lt;span class="s"&gt;"LayoutOptions.Center"&lt;/span&gt; &lt;span class="na"&gt;FontSize=&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;Label&lt;/span&gt; &lt;span class="na"&gt;Text=&lt;/span&gt;&lt;span class="s"&gt;"Unexpected error has occured:"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;Label&amp;gt;&lt;/span&gt;@context.Message&lt;span class="nt"&gt;&amp;lt;/Label&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;"Return"&lt;/span&gt; &lt;span class="na"&gt;OnClick=&lt;/span&gt;&lt;span class="s"&gt;"Recover"&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;/ContentPage&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/ErrorContent&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/ErrorBoundary&amp;gt;&lt;/span&gt;

@code {
    [Parameter] public RenderFragment ChildContent { get; set; }

    ErrorBoundary _errorBoundary;

    void Recover() {
        _errorBoundary.Recover();
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--th1MvBM3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tf2i5py7i94dpeage63a.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--th1MvBM3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tf2i5py7i94dpeage63a.gif" alt="Error Boundary" width="366" height="793"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;[!NOTE]&lt;br&gt;
You'll need to create your ErrorBoundary type, implementing ErrorBoundaryBase. You can take a look &lt;a href="https://github.com/Dreamescaper/BlazorBindings.Maui/blob/main/samples/ControlGallery/Views/ErrorBoundaries/ErrorBoundary.cs"&gt;here&lt;/a&gt; for an example.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Entry is generic
&lt;/h2&gt;

&lt;p&gt;Entry component is generic now, which allows binding the value to non-string properties, like &lt;code&gt;int&lt;/code&gt; or &lt;code&gt;decimal&lt;/code&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;Label&amp;gt;&lt;/span&gt;Int entry: @_int&lt;span class="nt"&gt;&amp;lt;/Label&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;Entry&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;bind-Text=&lt;/span&gt;&lt;span class="s"&gt;"_int"&lt;/span&gt; &lt;span class="na"&gt;Keyboard=&lt;/span&gt;&lt;span class="s"&gt;"Keyboard.Numeric"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

@code{
    int _int;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;[!NOTE]&lt;br&gt;
While this change should not cause any troubles in most cases (since Blazor is able to infer generic argument from the &lt;code&gt;@bind&lt;/code&gt; directive),&lt;br&gt;
it still might cause compilation errors in some cases. You can add &lt;code&gt;T="string"&lt;/code&gt; attribute value to resolve that.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Other changes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Component Generator adds XML documentation now.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Breaking changes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Due to some internal changes, components created via Component Generator have to be regenerated.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;NativeControlComponentBase.ElementHandler&lt;/code&gt; is protected now.&lt;/li&gt;
&lt;li&gt;Control components do not inherit &lt;code&gt;ComponentBase&lt;/code&gt; anymore.&lt;/li&gt;
&lt;li&gt;Default error page is removed. Application will crash in case of unhandled exceptions now.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;MauiBlazorBindingsRenderer&lt;/code&gt; does not support rendering the component to non-Application parent.&lt;/li&gt;
&lt;li&gt;Some methods, which are not stable yet, have &lt;a href="https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca2252"&gt;[RequiresPreviewFeatures]&lt;/a&gt; attribute now.&lt;/li&gt;
&lt;li&gt;Entry component is generic now (see above).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Shell URL navigation improvements.&lt;/li&gt;
&lt;li&gt;Supporting DataTemplateSelectors.&lt;/li&gt;
&lt;li&gt;Supporting Maps controls, which were added in MAUI for .NET 7.&lt;/li&gt;
&lt;li&gt;Improving the documentation.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>dotnetmaui</category>
      <category>dotnet</category>
      <category>maui</category>
      <category>blazor</category>
    </item>
    <item>
      <title>BlazorBindings.Maui - Preview 10</title>
      <dc:creator>Oleksandr Liakhevych</dc:creator>
      <pubDate>Fri, 18 Nov 2022 16:17:39 +0000</pubDate>
      <link>https://dev.to/dreamescaper/blazorbindingsmaui-preview-10-5c35</link>
      <guid>https://dev.to/dreamescaper/blazorbindingsmaui-preview-10-5c35</guid>
      <description>&lt;p&gt;Another &lt;a href="https://github.com/Dreamescaper/BlazorBindings.Maui" rel="noopener noreferrer"&gt;BlazorBindings.Maui&lt;/a&gt; update, which adds .NET 7 support, component generator and others improvements. Take a look at &lt;a href="//../get-started.md"&gt;Get Started&lt;/a&gt; page to check it out!&lt;/p&gt;

&lt;h2&gt;
  
  
  About this project
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/Dreamescaper/BlazorBindings.Maui" rel="noopener noreferrer"&gt;This project&lt;/a&gt; is a fork of MobileBlazorBindings - experimental project by Microsoft to allow to use Blazor syntax for native controls instead of XAML with MAUI. Here is a sample Counter component that renders native UI, which may look familiar to Blazor developers, that increments a value on each button press:&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;StackLayout&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"30"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;You pressed @count times &lt;span class="nt"&gt;&amp;lt;/Label&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;"+1"&lt;/span&gt; &lt;span class="na"&gt;OnClick=&lt;/span&gt;&lt;span class="s"&gt;"@HandleClick"&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;

@code {
    int count;

    void HandleClick()
    {
        count++;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://camo.githubusercontent.com/554d00d915708b2059da912c31662b22f3ea93d72431c30e278c3d39d3d02ed9/68747470733a2f2f646576626c6f67732e6d6963726f736f66742e636f6d2f6173706e65742f77702d636f6e74656e742f75706c6f6164732f73697465732f31362f323032302f30312f626c617a6f722d616e64726f69642d636f756e7465722d322e676966" class="article-body-image-wrapper"&gt;&lt;img src="https://camo.githubusercontent.com/554d00d915708b2059da912c31662b22f3ea93d72431c30e278c3d39d3d02ed9/68747470733a2f2f646576626c6f67732e6d6963726f736f66742e636f6d2f6173706e65742f77702d636f6e74656e742f75706c6f6164732f73697465732f31362f323032302f30312f626c617a6f722d616e64726f69642d636f756e7465722d322e676966" alt="Android emulator" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Previous release notes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dreamescaper.github.io/MobileBlazorBindingsDocs/maui-blazor-bindings/release-notes/preview-6.html" rel="noopener noreferrer"&gt;Preview 6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dreamescaper.github.io/MobileBlazorBindingsDocs/maui-blazor-bindings/release-notes/preview-7.html" rel="noopener noreferrer"&gt;Preview 7&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dreamescaper.github.io/MobileBlazorBindingsDocs/maui-blazor-bindings/release-notes/preview-8.html" rel="noopener noreferrer"&gt;Preview 8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/dreamescaper/blazorbindingsmaui-preview-9-4iob"&gt;Preview 9&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  .NET 7 support
&lt;/h2&gt;

&lt;p&gt;BlazorBindings.Maui is updated to use .NET 7. .NET 6 projects are not supported anymore.&lt;/p&gt;

&lt;h2&gt;
  
  
  Navigation improvements
&lt;/h2&gt;

&lt;p&gt;Previously, the only supported way for navigation was URI-based Shell navigation. But it has its limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It can be used with Shell-based applications only.&lt;/li&gt;
&lt;li&gt;Cannot pass arbitrary parameters, only the ones based on URL path.&lt;/li&gt;
&lt;li&gt;Hard to use with modal navigation.&lt;/li&gt;
&lt;li&gt;Inconvenient in some cases.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Preview 10 &lt;code&gt;INavigation&lt;/code&gt; type is added, which allows you to perform regular navigation in addition to URI-based.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note that you can use regular navigation for Shell-based applications as well.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For instance, let's say you have the following page component:&lt;br&gt;
&lt;code&gt;TargetPage.razor&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ContentPage&lt;/span&gt; &lt;span class="na"&gt;Title=&lt;/span&gt;&lt;span class="s"&gt;"Target Page"&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;Label&amp;gt;&lt;/span&gt;Hello, @UserName&lt;span class="nt"&gt;&amp;lt;/Label&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;/ContentPage&amp;gt;&lt;/span&gt;

@code {
    [Parameter] public string UserName {get; set;} 
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can use the following code in your main page component to navigate to &lt;code&gt;TargetPage&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;@inject INavigation Navigation;

/* MainPage content */
&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;"Go to target page"&lt;/span&gt; &lt;span class="na"&gt;OnClick=&lt;/span&gt;&lt;span class="s"&gt;"NavigateToTargetPage"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

@code {
    Task NavigateToTargetPage() =&amp;gt; Navigation.PushAsync&lt;span class="nt"&gt;&amp;lt;TargetPage&amp;gt;&lt;/span&gt;(new()
    {
        [nameof(TargetPage.UserName)] = "Jayne Cobb"
    });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also perform modal navigation via &lt;code&gt;PushModalAsync&lt;/code&gt; method:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;@code {
    Task NavigateToTargetModalPage() =&amp;gt; Navigation.PushModalAsync&lt;span class="nt"&gt;&amp;lt;TargetPage&amp;gt;&lt;/span&gt;(new()
    {
        [nameof(TargetPage.UserName)] = "Jayne Cobb"
    });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;You can read more about navigation stack and modal navigation in MAUI &lt;a href="https://learn.microsoft.com/en-us/dotnet/maui/user-interface/pages/navigationpage?view=net-maui-7.0#push-pages-to-the-modal-stack" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In addition to that, &lt;code&gt;INavigation&lt;/code&gt; provides overloads, which accept &lt;code&gt;RenderFragment&lt;/code&gt; argument. This allows to use a bit exotic, but easier to read syntax:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;@code {
    Task NavigateViaRenderFragment() =&amp;gt; Navigation.PushAsync(
        @&lt;span class="nt"&gt;&amp;lt;TargetPage&lt;/span&gt; &lt;span class="na"&gt;UserName=&lt;/span&gt;&lt;span class="s"&gt;"Jayne Cobb"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;This syntax is only available in .razor files, not in regular .cs files.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Shell properties
&lt;/h2&gt;

&lt;p&gt;Previously, it was possible to set Shell attached properties to a certain Page via Blazor "unmatched" values (read &lt;a href="//./preview-7.html#attached-properties-support"&gt;here&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;ContentPage&lt;/span&gt; &lt;span class="na"&gt;Title=&lt;/span&gt;&lt;span class="s"&gt;"Shell Properties"&lt;/span&gt;
             &lt;span class="na"&gt;Shell.NavBarIsVisible=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;
             &lt;span class="na"&gt;Shell.TabBarIsVisible=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;
             &lt;span class="na"&gt;Shell.TitleColor=&lt;/span&gt;&lt;span class="s"&gt;"@Colors.Green"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
...
&lt;span class="nt"&gt;&amp;lt;/ContentPage&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, this approach is quite limited and not user-friendly - not all properties are possible to set this way (e.g. TitleView), it misses IntelliSense or any compile-time validation, etc. Because of that, some mostly used attached properties are added to &lt;code&gt;ContentPage&lt;/code&gt; component as regular properties:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ContentPage&lt;/span&gt; &lt;span class="na"&gt;Title=&lt;/span&gt;&lt;span class="s"&gt;"Shell Properties"&lt;/span&gt;
             &lt;span class="na"&gt;NavBarIsVisible=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;
             &lt;span class="na"&gt;TabBarIsVisible=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;
             &lt;span class="na"&gt;TitleColor=&lt;/span&gt;&lt;span class="s"&gt;"@Colors.Green"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
...
&lt;span class="nt"&gt;&amp;lt;/ContentPage&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Component generator improvements
&lt;/h2&gt;

&lt;p&gt;ComponentGenerator is updated to support generating &lt;code&gt;DataTemplate&lt;/code&gt; and &lt;code&gt;ElementTemplate&lt;/code&gt; properties (with &lt;code&gt;RenderFragment&lt;/code&gt; type), generic properties and &lt;code&gt;Brush&lt;/code&gt; properties. Most of the components in &lt;code&gt;BlazorBindings.Maui&lt;/code&gt; are created using this generator, therefore it allowed to add some properties missed before.&lt;/p&gt;

&lt;h2&gt;
  
  
  Breaking changes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Generated components should be re-generated
&lt;/h3&gt;

&lt;p&gt;Due to some internal changes, components created by component generated from previous version will probably not work. Simply re-generating them should be sufficient.&lt;/p&gt;

&lt;h3&gt;
  
  
  ShellNavigationManager is deprecated
&lt;/h3&gt;

&lt;p&gt;Since &lt;code&gt;INavigation&lt;/code&gt; contains all &lt;code&gt;ShellNavigationManager&lt;/code&gt; functionality, &lt;code&gt;INavigation&lt;/code&gt; should be used instead. &lt;code&gt;ShellNavigationManager&lt;/code&gt; is deprecated and will be removed in the next version.&lt;/p&gt;

&lt;h2&gt;
  
  
  What next?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Getting closer to a stable release, it is planned to make final breaking changes, stabilize the API, improve the documentation and test coverage.&lt;/li&gt;
&lt;li&gt;Generator improvements are planned as well, specifically to include properties documentation.&lt;/li&gt;
&lt;li&gt;Supporting Maps controls, which were added in MAUI for .NET 7.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have any suggestions or ideas, you are welcome log &lt;a href="https://github.com/Dreamescaper/BlazorBindings.Maui/issues" rel="noopener noreferrer"&gt;issues&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>html</category>
      <category>webdev</category>
    </item>
    <item>
      <title>BlazorBindings.Maui - Preview 9</title>
      <dc:creator>Oleksandr Liakhevych</dc:creator>
      <pubDate>Fri, 23 Sep 2022 13:50:01 +0000</pubDate>
      <link>https://dev.to/dreamescaper/blazorbindingsmaui-preview-9-4iob</link>
      <guid>https://dev.to/dreamescaper/blazorbindingsmaui-preview-9-4iob</guid>
      <description>&lt;p&gt;Another &lt;a href="https://github.com/Dreamescaper/BlazorBindings.Maui" rel="noopener noreferrer"&gt;BlazorBindings.Maui&lt;/a&gt; update, which adds component generator, shadows, and other improvements. Take a look at &lt;a href="https://dreamescaper.github.io/MobileBlazorBindingsDocs/maui-blazor-bindings/get-started.html" rel="noopener noreferrer"&gt;Get Started&lt;/a&gt; page to check it out!&lt;/p&gt;

&lt;h2&gt;
  
  
  About this project
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/Dreamescaper/BlazorBindings.Maui" rel="noopener noreferrer"&gt;This project&lt;/a&gt; is a fork of MobileBlazorBindings - experimental project by Microsoft to allow to use Blazor syntax for native controls instead of XAML. Here is a sample Counter component that renders native UI, which may look familiar to Blazor developers, that increments a value on each button press:&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;StackLayout&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Label&lt;/span&gt; &lt;span class="na"&gt;FontSize=&lt;/span&gt;&lt;span class="s"&gt;"30"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;You pressed @count times &lt;span class="nt"&gt;&amp;lt;/Label&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;"+1"&lt;/span&gt; &lt;span class="na"&gt;OnClick=&lt;/span&gt;&lt;span class="s"&gt;"@HandleClick"&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;

@code {
    int count;

    void HandleClick()
    {
        count++;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://camo.githubusercontent.com/554d00d915708b2059da912c31662b22f3ea93d72431c30e278c3d39d3d02ed9/68747470733a2f2f646576626c6f67732e6d6963726f736f66742e636f6d2f6173706e65742f77702d636f6e74656e742f75706c6f6164732f73697465732f31362f323032302f30312f626c617a6f722d616e64726f69642d636f756e7465722d322e676966" class="article-body-image-wrapper"&gt;&lt;img src="https://camo.githubusercontent.com/554d00d915708b2059da912c31662b22f3ea93d72431c30e278c3d39d3d02ed9/68747470733a2f2f646576626c6f67732e6d6963726f736f66742e636f6d2f6173706e65742f77702d636f6e74656e742f75706c6f6164732f73697465732f31362f323032302f30312f626c617a6f722d616e64726f69642d636f756e7465722d322e676966" alt="Android emulator"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Previous release notes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dreamescaper.github.io/MobileBlazorBindingsDocs/maui-blazor-bindings/release-notes/preview-6.html" rel="noopener noreferrer"&gt;Preview 6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dreamescaper.github.io/MobileBlazorBindingsDocs/maui-blazor-bindings/release-notes/preview-7.html" rel="noopener noreferrer"&gt;Preview 7&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dreamescaper.github.io/MobileBlazorBindingsDocs/maui-blazor-bindings/release-notes/preview-8.html" rel="noopener noreferrer"&gt;Preview 8&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Component Generator
&lt;/h2&gt;

&lt;p&gt;This release adds the ability to generate Blazor components for third party controls. Originally it was planned to implement it as a &lt;a href="https://docs.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/source-generators-overview" rel="noopener noreferrer"&gt;source generator&lt;/a&gt;, but, unfortunately, source generators don't play well with razor files. Therefore, generator is packed as a dotnet tool. In order to generate Blazor component for a control, you need to add an assembly attribute with control info, e.g.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;assembly&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;GenerateComponent&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;CommunityToolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Maui&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Views&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AvatarView&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, you need to install and run generator tool in project folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dotnet tool install --global BlazorBindings.Maui.ComponentGenerator --version 0.9.2-preview

dotnet generate-maui-blazor-components
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You take a look at &lt;a href="https://github.com/Dreamescaper/BlazorBindings.Maui/blob/main/samples/ThirdPartyControlsSample/Properties/Elements.cs" rel="noopener noreferrer"&gt;a sample project&lt;/a&gt; with generated components for &lt;code&gt;AlohaKit&lt;/code&gt; and &lt;code&gt;CommunityToolkit&lt;/code&gt; libraries.&lt;/p&gt;

&lt;p&gt;Keep in mind that it doesn't support some parameter types (like Shapes or Templates) so far.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shadows
&lt;/h2&gt;

&lt;p&gt;Shadows are supported with Blazor components now:&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;Image&lt;/span&gt; &lt;span class="na"&gt;Source=&lt;/span&gt;&lt;span class="s"&gt;@("dotnet_bot.png")&lt;/span&gt;
       &lt;span class="na"&gt;WidthRequest=&lt;/span&gt;&lt;span class="s"&gt;"250"&lt;/span&gt;
       &lt;span class="na"&gt;HeightRequest=&lt;/span&gt;&lt;span class="s"&gt;"310"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Shadow&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Shadow&lt;/span&gt; &lt;span class="na"&gt;Color=&lt;/span&gt;&lt;span class="s"&gt;"Colors.Black"&lt;/span&gt;
                &lt;span class="na"&gt;Offset=&lt;/span&gt;&lt;span class="s"&gt;"new (20, 20)"&lt;/span&gt;
                &lt;span class="na"&gt;Radius=&lt;/span&gt;&lt;span class="s"&gt;"50"&lt;/span&gt;
                &lt;span class="na"&gt;Opacity=&lt;/span&gt;&lt;span class="s"&gt;"0.8f"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Shadow&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Image&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnqsjo6ud1vr9gejymui2.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnqsjo6ud1vr9gejymui2.png" alt="Shadows"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Gesture events
&lt;/h2&gt;

&lt;p&gt;In order to add, for instance, tap event handler for some arbitrary control, you use Maui Gesture Recognizers. And that is already possible with Maui Blazor Bindings as well. However, the syntax is quite verbose, so this release adds events for the most used gestures directly to component (they are still implemented as gesture recognizers underneath):&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;Frame&lt;/span&gt; &lt;span class="na"&gt;OnTap=&lt;/span&gt;&lt;span class="s"&gt;"OnTap"&lt;/span&gt;
       &lt;span class="na"&gt;OnDoubleTap=&lt;/span&gt;&lt;span class="s"&gt;"OnDoubleTap"&lt;/span&gt;
       &lt;span class="na"&gt;OnPanUpdate=&lt;/span&gt;&lt;span class="s"&gt;"OnPanUpdate"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Label&amp;gt;&lt;/span&gt;@Item - @status&lt;span class="nt"&gt;&amp;lt;/Label&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Frame&amp;gt;&lt;/span&gt;

@code {
    [Parameter] public int Item { get; set; }

    string status = "Pending";

    void OnTap() =&amp;gt; status = "Tapped";
    void OnDoubleTap() =&amp;gt; status = "Double Tapped";

    async Task OnPanUpdate(PanUpdatedEventArgs args)
    {
        // ...
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjj3928glkds5wv0ohqgt.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjj3928glkds5wv0ohqgt.gif" alt="Gesture events"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Breaking changes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Significant internal changes
&lt;/h3&gt;

&lt;p&gt;In Preview 9 element wrappers implementation is changed significantly in order to simplify it and to improve performance. Blazor components API is unchanged, so it won't affect most users. But if you have created any custom bindings (e.g. wrapping a third party control), they will probably not work with Preview 9. Hopefully, that woundn't be a huge issue thanks to a component generator.&lt;/p&gt;

&lt;h3&gt;
  
  
  TimePicker / DatePicker updates
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;TimePicker&lt;/code&gt; is updated to use recently-added &lt;code&gt;TimeOnly&lt;/code&gt; type instead of &lt;code&gt;TimeSpan&lt;/code&gt;, as this type is much more suitable to represent time of day. Same, &lt;code&gt;DatePicker&lt;/code&gt; is updated to use &lt;code&gt;DateOnly&lt;/code&gt; instead of &lt;code&gt;DateTime&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What next?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Further ComponentGenerator improvements (&lt;a href="https://github.com/Dreamescaper/BlazorBindings.Maui/issues/45" rel="noopener noreferrer"&gt;#45&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Navigation service overhaul (&lt;a href="https://github.com/Dreamescaper/BlazorBindings.Maui/issues/44" rel="noopener noreferrer"&gt;#44&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have any suggestions or ideas, you are welcome log &lt;a href="https://github.com/Dreamescaper/BlazorBindings.Maui/issues" rel="noopener noreferrer"&gt;issues&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>dotnetmaui</category>
      <category>dotnet</category>
      <category>maui</category>
      <category>blazor</category>
    </item>
  </channel>
</rss>
