<?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: Samuel José Bolaño Mejía</title>
    <description>The latest articles on DEV Community by Samuel José Bolaño Mejía (@samuel_bolao_373cd8a2208).</description>
    <link>https://dev.to/samuel_bolao_373cd8a2208</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%2F1571151%2F377c5c91-0486-4065-bacf-c9d60b7101ef.jpg</url>
      <title>DEV Community: Samuel José Bolaño Mejía</title>
      <link>https://dev.to/samuel_bolao_373cd8a2208</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/samuel_bolao_373cd8a2208"/>
    <language>en</language>
    <item>
      <title>Guía rápida para MVVM Toolkit .NET MAUI</title>
      <dc:creator>Samuel José Bolaño Mejía</dc:creator>
      <pubDate>Sat, 14 Jun 2025 22:12:45 +0000</pubDate>
      <link>https://dev.to/samuel_bolao_373cd8a2208/guia-rapida-para-mvvm-toolkit-net-maui-1ape</link>
      <guid>https://dev.to/samuel_bolao_373cd8a2208/guia-rapida-para-mvvm-toolkit-net-maui-1ape</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introducción&lt;/strong&gt;&lt;br&gt;
En el desarrollo con .NET MAUI, seguir el patrón MVVM (Model-View-ViewModel) es clave para separar la lógica de negocio de la interfaz. Pero muchas veces terminamos escribiendo mucho código repetitivo solo para implementar cosas básicas como INotifyPropertyChanged o comandos.&lt;/p&gt;

&lt;p&gt;Por suerte, CommunityToolkit.Mvvm viene al rescate con atributos que hacen el trabajo pesado por ti.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué es MVVM Toolkit?&lt;/strong&gt;&lt;br&gt;
Es una librería oficial de Microsoft incluida en el paquete CommunityToolkit.Mvvm, que te permite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Crear propiedades observables con solo un atributo.&lt;/li&gt;
&lt;li&gt;Declarar comandos sin necesidad de crear clases heredadas de ICommand.&lt;/li&gt;
&lt;li&gt;Evitar INotifyPropertyChanged manual.&lt;/li&gt;
&lt;li&gt;Usar inyección de dependencias.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Instalación&lt;/strong&gt;&lt;br&gt;
Desde el Administrar paquetes NuGet en Visual Studio, busca:&lt;br&gt;
CommunityToolkit.Mvvm (by dotnetfoundation)&lt;/p&gt;

&lt;p&gt;Haz clic en &lt;strong&gt;"Instalar"&lt;/strong&gt;.&lt;br&gt;
&lt;a href="https://media2.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%2Fuzzp1vfqzkg5w1ux07sj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuzzp1vfqzkg5w1ux07sj.png" alt="Image description" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sin Toolkit nuestro ViewModel luciría así:&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;using System.ComponentModel;
using System.Windows.Input;

namespace MVVM_SAMPLE.ViewModels
{
    public class LoginViewModel : INotifyPropertyChanged
    {
        private string _username;

        public string Username
        {
            get =&amp;gt; _username;
            set
            {
                _username = value;
                OnPropertyChanged(nameof(Username));
            }
        }

        public ICommand LoginCommand { get; }

        public LoginViewModel()
        {
            LoginCommand = new Command(OnLogin);
        }

        private void OnLogin()
        {
            // Lógica de login
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string name) =&amp;gt;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }
}

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Con MVVM Toolkit:&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;using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;

namespace MVVM_SAMPLE.ViewModels
{
    public partial class LoginViewModel : ObservableObject
    {
        [ObservableProperty]
        private string username;

        [RelayCommand]
        private void OnLogin()
        {
            // Lógica de login
        }
    }
}


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

&lt;/div&gt;



&lt;p&gt;El Toolkit genera automáticamente la propiedad pública UserName con su get, set y la notificación de cambios (INotifyPropertyChanged) en tiempo de compilación. &lt;/p&gt;

&lt;p&gt;Internamente, el atributo &lt;code&gt;[ObservableProperty]&lt;/code&gt; usa source generators, una funcionalidad de C# que permite generar código durante la compilación. Así, tú escribes menos, y el resultado es el mismo o incluso más limpio.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ejemplo completo&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;using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;


namespace MVVM_SAMPLE.ViewModels
{
    public partial class LoginViewModel : ObservableObject
    {
        [ObservableProperty]
        private string username;

        [ObservableProperty]
        private string password;

        [RelayCommand]
        private async Task LoginAsync()
        {
            if (Username == "admin" &amp;amp;&amp;amp; Password == "1234")
                await Shell.Current.DisplayAlert("Acceso", "Login exitoso", "OK");
            else
                await Shell.Current.DisplayAlert("Error", "Credenciales incorrectas", "OK");
        }
    }

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Y en tu XAML:&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;&amp;lt;Entry Text="{Binding Username}" Placeholder="Usuario" /&amp;gt;
&amp;lt;Entry Text="{Binding Password}" IsPassword="True" /&amp;gt;
&amp;lt;Button Text="Iniciar sesión" Command="{Binding LoginCommand}" /&amp;gt;

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

&lt;/div&gt;






&lt;h2&gt;
  
  
  ¿Y tú, ya lo usaste?
&lt;/h2&gt;

&lt;p&gt;¿Ya conocías el MVVM Toolkit?&lt;br&gt;&lt;br&gt;
👇 ¡Te leo en los comentarios!&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>netmaui</category>
      <category>mvvm</category>
    </item>
  </channel>
</rss>
