Comandos em C#: Desacoplamento e MVVM para Interfaces

Introduzir comandos no desenvolvimento de interfaces📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!Descubra como as interfaces em C# funcionam como contratos que garantem implementações flexíveis e robustas, facilitando o design e testes de sistemas. gráficas em C# (seja no WPF ou no MAUI) é uma forma de desacoplar a lógica de negócio dos eventos da interface📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!Descubra como as interfaces em C# funcionam como contratos que garantem implementações flexíveis e robustas, facilitando o design e testes de sistemas.. Ao invés de colocar o código diretamente no evento do botão (por exemplo, no code-behind), podemos criar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. um Command que encapsula a ação em si. Isso traz organização, facilita testes e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. deixa tudo mais limpo.

A seguir, vamos explorar o que são Commands, por que você deve usá-los e como implementá-los na prática para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! desacoplar ações dos botões na sua aplicação desktop ou multiplataforma🌍 MAUI: Multiplataforma com uma Única Base de Código!🌍 MAUI: Multiplataforma com uma Única Base de Código!Aprenda como criar aplicativos multiplataforma com .NET MAUI. Descubra dicas, exemplos práticos e boas práticas para desenvolver apps nativos usando C#..

Tabela de Conteúdo🔗

O que são Commands🔗

Em aplicações desktop (como WPF) ou multiplataforma🌍 MAUI: Multiplataforma com uma Única Base de Código!🌍 MAUI: Multiplataforma com uma Única Base de Código!Aprenda como criar aplicativos multiplataforma com .NET MAUI. Descubra dicas, exemplos práticos e boas práticas para desenvolver apps nativos usando C#. (como MAUI), um Command é uma forma de centralizar a lógica que será executada quando📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. interagimos com um controle, como um botão. No lugar de tratarmos o evento Click, dizemos algo como:

"Este botão invoca o Command X, que sabe o que fazer."

Assim, você não precisa de um handler de evento no code-behind do formulário ou janela. Em projetos🌐 LinkedIn para Devs .NET: Perfil que Atrai Recrutadores!🌐 LinkedIn para Devs .NET: Perfil que Atrai Recrutadores!Aprenda a otimizar seu perfil LinkedIn com dicas essenciais para devs .NET. Conquiste oportunidades e destaque suas habilidades! que seguem o padrão MVVM🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!Descubra como o padrão MVVM separa a interface e a lógica de negócio, facilitando testes e manutenção, com exemplos e dicas práticas para seu projeto., o Command vive normalmente no ViewModel🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!Descubra como o padrão MVVM separa a interface e a lógica de negócio, facilitando testes e manutenção, com exemplos e dicas práticas para seu projeto., garantindo o desacoplamento entre a interface📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!Descubra como as interfaces em C# funcionam como contratos que garantem implementações flexíveis e robustas, facilitando o design e testes de sistemas. e a lógica.

Vantagens de Usar Commands🔗

Criando seu Primeiro Command🔗

O ingrediente principal para criar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. um Command em C# é a interface📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!Descubra como as interfaces em C# funcionam como contratos que garantem implementações flexíveis e robustas, facilitando o design e testes de sistemas. ICommand. Ela possui alguns membros que precisamos implementar:

Um exemplo simples é criar uma classe🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara. RelayCommand ou DelegateCommand. Eis um modelo🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!Descubra como o padrão MVVM separa a interface e a lógica de negócio, facilitando testes e manutenção, com exemplos e dicas práticas para seu projeto. genérico de RelayCommand:

using System;
using System.Windows.Input;
public class RelayCommand : ICommand
{
    private readonly Action<object> _execute;
    private readonly Func<object, bool> _canExecute;
    public event EventHandler CanExecuteChanged;
    public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
    {
        _execute = execute;
        _canExecute = canExecute;
    }
    public bool CanExecute(object parameter)
        => _canExecute == null || _canExecute(parameter);
    public void Execute(object parameter)
        => _execute(parameter);
    public void RaiseCanExecuteChanged()
        => CanExecuteChanged?.Invoke(this, EventArgs.Empty);
}

O construtor🔑 Construtores: Inicialize Objetos como um Arquiteto de OOP!🔑 Construtores: Inicialize Objetos como um Arquiteto de OOP!Descubra como os construtores em C# estruturam objetos, garantindo inicialização segura e promovendo boas práticas de desenvolvimento orientado a objetos. aceita duas lambdas:

Ligando o Command ao Botão via XAML🔗

Depois de ter esse Command pronto, você pode associá-lo a uma propriedade⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!Aprenda como utilizar propriedades em C# para encapsular dados, validar informações e manter um código organizado, seguro e de fácil manutenção. (por exemplo, IncrementCommand) no seu ViewModel🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!Descubra como o padrão MVVM separa a interface e a lógica de negócio, facilitando testes e manutenção, com exemplos e dicas práticas para seu projeto.. Então📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades., no seu XAML, você aponta para ele desta forma (no WPF, por exemplo):

<Window x:Class="MinhaApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:MinhaApp"
        Title="Exemplo Commands" Height="200" Width="400">
    <Grid>
        <Button Content="Incrementar"
                Command="{Binding IncrementCommand}"
                Width="100" Height="30"
                HorizontalAlignment="Center"
                VerticalAlignment="Center"/>
    </Grid>
</Window>

No code-behind do Window ou no seu ViewModel🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!Descubra como o padrão MVVM separa a interface e a lógica de negócio, facilitando testes e manutenção, com exemplos e dicas práticas para seu projeto., você define:

public class MainViewModel
{
    public ICommand IncrementCommand { get; }
    private int _contador;
    public int Contador
    {
        get => _contador;
        set
        {
            _contador = value;
            // Chamaria OnPropertyChanged aqui se estiver usando INotifyPropertyChanged
        }
    }
    public MainViewModel()
    {
        IncrementCommand = new RelayCommand(
            execute: (obj) =>
            {
                Contador++;
            },
            canExecute: (obj) => true // Pode colocar lógica para habilitar/desabilitar
        );
    }
}

Exemplo Prático: Contador Simples🔗

Imagine que você queira exibir um contador na tela:

1. A vista (View🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!Descubra como o padrão MVVM separa a interface e a lógica de negócio, facilitando testes e manutenção, com exemplos e dicas práticas para seu projeto.) tem um TextBlock para exibir o valor🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!Aprenda a usar dicionários em C# de modo prático e eficiente. Nosso tutorial mostra criação, acesso e otimização para manipular dados com segurança. do contador e um Button🖌️ XAML Básico: Crie Interfaces sem Código C# (Quase)!🖌️ XAML Básico: Crie Interfaces sem Código C# (Quase)!Descubra como usar XAML para criar interfaces atrativas em aplicações .NET. Aprenda conceitos e dicas práticas para iniciar seu projeto. para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! incrementá-lo.

2. O ViewModel🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!Descubra como o padrão MVVM separa a interface e a lógica de negócio, facilitando testes e manutenção, com exemplos e dicas práticas para seu projeto. possui a propriedade⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!Aprenda como utilizar propriedades em C# para encapsular dados, validar informações e manter um código organizado, seguro e de fácil manutenção. Contador e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. o Command para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! incrementar.

No XAML🖌️ XAML Básico: Crie Interfaces sem Código C# (Quase)!🖌️ XAML Básico: Crie Interfaces sem Código C# (Quase)!Descubra como usar XAML para criar interfaces atrativas em aplicações .NET. Aprenda conceitos e dicas práticas para iniciar seu projeto.:

<StackPanel Margin="20">
    <TextBlock Text="{Binding Contador, Mode=OneWay}"
               FontSize="24"
               HorizontalAlignment="Center"
               Margin="0,0,0,10"/>
    <Button Content="+1" Command="{Binding IncrementCommand}" Width="50" />
</StackPanel>

E📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. no ViewModel🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!Descubra como o padrão MVVM separa a interface e a lógica de negócio, facilitando testes e manutenção, com exemplos e dicas práticas para seu projeto.:

public class MainViewModel : INotifyPropertyChanged
{
    private int _contador;
    public int Contador
    {
        get => _contador;
        set
        {
            _contador = value;
            OnPropertyChanged(nameof(Contador));
        }
    }
    public ICommand IncrementCommand { get; }
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
        => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    public MainViewModel()
    {
        IncrementCommand = new RelayCommand(
            execute: _ => Contador++,
            canExecute: _ => true
        );
    }
}

Agora, cada clique no botão vai chamar Contador++, atualizando o valor🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!Aprenda a usar dicionários em C# de modo prático e eficiente. Nosso tutorial mostra criação, acesso e otimização para manipular dados com segurança. exibido no TextBlock.

Considerações sobre CanExecute🔗

O CanExecute é útil para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! habilitar ou desabilitar o botão dinamicamente. Por exemplo, se você quiser que o contador não passe de 10, poderia fazer:

IncrementCommand = new RelayCommand(
    execute: _ => Contador++,
    canExecute: _ => Contador < 10
);

E sempre que a propriedade⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!Aprenda como utilizar propriedades em C# para encapsular dados, validar informações e manter um código organizado, seguro e de fácil manutenção. Contador muda, você também pode notificar o comando para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! verificar se ainda pode executar:

set
{
    _contador = value;
    OnPropertyChanged(nameof(Contador));
    (IncrementCommand as RelayCommand)?.RaiseCanExecuteChanged();
}

Isso faz com que o botão desabilite automaticamente quando📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. Contador chegar em 10.

Conclusão e Boas Práticas🔗

Trabalhar com Commands dá mais estrutura ao seu código e torna mais simples adicionar📦 List<T>: Dinamismo além dos Arrays!📦 List<T>: Dinamismo além dos Arrays!Descubra como utilizar List<T> em C# de forma eficiente. Aprenda a criar, manipular e otimizar listas para diferentes cenários com exemplos práticos. novas funcionalidades sem criar uma bagunça de eventos dispersos. É o tipo de prática que certamente vai ajudar você a manter um projeto saudável e facilitar a vida no futuro. Boa programação!

🔗 O Problema dos Eventos Diretos nos Botões🔗

Imaginem este código típico em um botão de login🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!Aprenda a criar um sistema de login robusto em C#, com tratamento de erros adequado, validação e segurança para evitar vulnerabilidades.:

// ❌ Acoplamento Perigoso!
private void btnLogin_Click(object sender, RoutedEventArgs e)
{
    var usuario = txtUsuario.Text;
    var senha = txtSenha.Password;
    if (ValidarCredenciais(usuario, senha))
    {
        // 10 linhas de lógica...
        MessageBox.Show("Bem-vindo!");
    }
    else
    {
        // Mais código repetido...
    }
}

Problemas:

⚡ ICommand: A Interface que Desacopla Ações🔗

O padrão Command do WPF/MVVM resolve isso através da interface📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!Descubra como as interfaces em C# funcionam como contratos que garantem implementações flexíveis e robustas, facilitando o design e testes de sistemas. ICommand:

public interface ICommand
{
    bool CanExecute(object parameter);
    void Execute(object parameter);
    event EventHandler CanExecuteChanged;
}

Funcionamento:

1. Botão se liga a um comando via Command="{Binding LoginCommand}"

2. CanExecute define se o botão está habilitado ✅

3. Execute contém a lógica real da ação

🛠️ Implementando RelayCommand: Seu Novo Melhor Amigo🔗

Crie uma classe🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara. genérica para simplificar a criação de comandos:

// ✅ Implementação Prática
public class RelayCommand : ICommand
{
    private readonly Action<object> _execute;
    private readonly Func<object, bool> _canExecute;
    public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
    {
        _execute = execute ?? throw new ArgumentNullException(nameof(execute));
        _canExecute = canExecute;
    }
    public bool CanExecute(object parameter) => _canExecute == null || _canExecute(parameter);
    public void Execute(object parameter) => _execute(parameter);
    public event EventHandler CanExecuteChanged
    {
        add => CommandManager.RequerySuggested += value;
        remove => CommandManager.RequerySuggested -= value;
    }
}

Uso na ViewModel🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!Descubra como o padrão MVVM separa a interface e a lógica de negócio, facilitando testes e manutenção, com exemplos e dicas práticas para seu projeto.:

public class LoginViewModel
{
    public ICommand LoginCommand { get; }
    public LoginViewModel()
    {
        LoginCommand = new RelayCommand(ExecuteLogin, CanLogin);
    }
    private void ExecuteLogin(object parameter)
    {
        // Lógica limpa e testável!
        var (usuario, senha) = (parameter as Tuple<string, string>);
        // ...
    }
    private bool CanLogin(object parameter) => !string.IsNullOrEmpty(usuario);
}

🎯 Passando Parâmetros para Comandos🔗

Use o binding para enviar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. dados complexos:

<!-- No XAML -->
<Button Command="{Binding DeleteCommand}"
        CommandParameter="{Binding SelectedItem}"
        Content="Excluir"/>
// Na ViewModel
DeleteCommand = new RelayCommand(param =>
{
    var item = param as MeuItem;
    Itens.Remove(item);
}, param => param != null);

🧪 Vantagens em Testes e Manutenção🔗

1. Testabilidade:

[Test]
public void LoginCommand_DeveFalharComUsuarioVazio()
{
    var vm = new LoginViewModel();
    vm.Usuario = "";
    Assert.IsFalse(vm.LoginCommand.CanExecute(null));
}

2. Reuso: Um comando de "Salvar" pode ser usado em menu, botão e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. atalho de teclado

3. Separação de Responsabilidades: UI não sabe da lógica de negócio

🌍 Cenários Reais: Quando Usar Comandos?🔗

1. Ações com Pré-Condições (ex: botão habilitado somente se campos válidos)

2. Operações Demoradas (com cancelamento via CancellationToken🎯 CancellationToken: Cancele Operações Demoradas!🎯 CancellationToken: Cancele Operações Demoradas!Descubra como aplicar CancellationToken no C# para abortar operações com eficiência, evitando travas de UI e otimizando o uso de recursos das aplicações.)

3. Undo/Redo Systems (padrão Command histórico)

4. Multiplataforma🌍 MAUI: Multiplataforma com uma Única Base de Código!🌍 MAUI: Multiplataforma com uma Única Base de Código!Aprenda como criar aplicativos multiplataforma com .NET MAUI. Descubra dicas, exemplos práticos e boas práticas para desenvolver apps nativos usando C#. (mesma lógica em WPF, MAUI🌍 MAUI: Multiplataforma com uma Única Base de Código!🌍 MAUI: Multiplataforma com uma Única Base de Código!Aprenda como criar aplicativos multiplataforma com .NET MAUI. Descubra dicas, exemplos práticos e boas práticas para desenvolver apps nativos usando C#. e Blazor)

🧩 Desafio Prático: Calculadora com Comandos🔗

Objetivo: Criar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. uma calculadora onde cada operação (+,-,,/) é um comando separado.

Passos:

1. Crie uma classe🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara. CalculadoraViewModel

2. Implemente comandos para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! cada operação

3. Use CommandParameter para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! capturar números

4. Garanta que divisão🔢 Operadores Aritméticos: Faça Cálculos como uma Calculadora Humana!🔢 Operadores Aritméticos: Faça Cálculos como uma Calculadora Humana!Aprenda a dominar operadores aritméticos em C# com exemplos práticos, técnicas de cálculo e dicas para evitar erros e maximizar resultados. por zero desabilite o botão ➗

Dica:

public ICommand DividirCommand => new RelayCommand(
    param => Resultado = Numero1 / Numero2,
    param => Numero2 != 0);
Dica para Managers/QA: Com comandos, fica fácil rastrear qual ação foi disparada através do nome do comando, melhorando a comunicação em testes e especificações.
Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados