Pergunta

estou seguindo o M-V-VM padrão para minha UI WPF.Gostaria de conectar um comando ao evento TextChanged de um TextBox a um comando que está na minha classe ViewModel.A única maneira que consigo concluir essa tarefa é herdar do controle TextBox e implementar ICommandSource.Posso então instruir o comando a ser disparado a partir do evento TextChanged.Isto parece ser muito trabalhoso para algo que parece ser tão simples.

Existe uma maneira mais fácil (do que subclassificar TextBox e implementar ICommandSource) de conectar o evento TextChanged à minha classe ViewModel?

Foi útil?

Solução

Primeiro, você certamente considerou a vinculação de dados bidirecional ao seu modelo de visualização, com um UpdateSourceTrigger de PropertyChanged?Dessa forma, o configurador de propriedades da propriedade à qual você está vinculado será chamado toda vez que o texto for alterado?

Se isso não for suficiente, eu resolveria esse problema usando Attached Behaviors.No Blog de Julian Dominguez você encontrará um artigo sobre como fazer algo muito semelhante no Silverlight, que deve ser facilmente adaptável ao WPF.

Basicamente, em uma classe estática (chamada, digamos, TextBoxBehaviours), você define uma propriedade anexada chamada (talvez) TextChangedCommand do tipo ICommand.Conecte um manipulador OnPropertyChanged para essa propriedade e, dentro do manipulador, verifique se a propriedade está sendo definida em um TextBox;se for, adicione um manipulador ao evento TextChanged na caixa de texto que chamará o comando especificado na propriedade.

Então, supondo que seu viewmodel tenha sido atribuído ao DataContext da sua View, você o usaria como:

<TextBox
  x:Name="MyTextBox"
  TextBoxBehaviours.TextChangedCommand="{Binding ViewModelTextChangedCommand}" />

Outras dicas

Usar a ligação de evento e o método de comando pode não ser a coisa certa a usar.O que exatamente esse comando fará?

Você pode querer considerar o uso de uma ligação de dados para um campo de string em sua VM.Dessa forma, você pode fazer uma chamada para um comando ou função a partir daí, em vez de se preocupar com a interface do usuário.

<TextBox Text="{Binding WorldName}"/>
....
public string WorldName
{
    get
    {
        return WorldData.Name;
    }
    set
    {
        WorldData.Name = value;
        OnPropertyChanged("WorldName");
        // CallYourCustomFunctionHere();
    }
}

Você não pode simplesmente manipular o evento TextChanged e executar o comando a partir daí?

private void _textBox_TextChanged(object sender, EventArgs e)
{
    MyCommand.Execute(null);
}

A alternativa, como você diz, é criar um TextBox que atua como uma fonte de comando, mas parece um exagero, a menos que seja algo que você esteja planejando compartilhar e aproveitar em muitos lugares.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top