WPF MVVM Como pegar a alterações de texto no Botão, Clique em

0

Pergunta

Eu estou trabalhando em um projeto do WPF com MVVM e me deparei com um problema de não pegar a última alteração de texto quando eu clicar no botão salvar.

Meu componentes são de configuração como esta:

  1. Uma barra de ferramentas modo de exibição com a barra de ferramentas VM, que tem o botão salvar. botão clique em evento está vinculado a um Icommand.
  2. Um modo de exibição formulário com vários campos de texto, vinculado a um sepreate VM.
  3. a barra de ferramentas e modo formulário são em separado arquivos.
  4. todas as minhas VMs herda BindableBase (parte do Prisma.MvvM pacote)

No clique do botão, eu vou levar os valores do formulário de VM e salvá-los... simples e stragight para a frente. Está tudo bem, exceto que, após a edição do último campo, clicando no botão salvar não acionar a perder o foco do evento. Portanto, o Conjunto de propriedades de evento não é disparado. Vou ter de clique de distância a partir de campos que depois de editar, em seguida, clique no botão. Aqui está o meu código:

 public class ViewModel: BindableBase
{
    private string _someText;

    public string SomeText
    {
        get { return _someText; }
        set { SetProperty(ref _someText, value); }
    }
}

na visão XAML:

  <TextBox Text="{Binding SomeText}"/>

na barra de ferramentas XAML:

<Button Command="{Binding SaveCommand}" ToolTip="Save">
</Button>

ViewModel para a barra de ferramentas:

 public class ToolbarViewModel : BindableBase
{
    private ICommand _saveCommand;
    public ICommand SaveCommand
    {
        get
        {
            return _saveCommand ?? (_saveCommand = new BaseCommandHandler(() => { 
                //Save code
            }, () => true));
        }
    }
}

código para BaseCommandHandler:

 public class BaseCommandHandler : ICommand
{
    private Action _action;
    private Func<bool> _canExecute;

    /// <summary>
    /// Creates instance of the command handler
    /// </summary>
    /// <param name="action">Action to be executed by the command</param>
    /// <param name="canExecute">A bolean property to containing current permissions to execute the command</param>
    public BaseCommandHandler(Action action, Func<bool> canExecute)
    {
        _action = action;
        _canExecute = canExecute;
    }

    /// <summary>
    /// Wires CanExecuteChanged event 
    /// </summary>
    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    /// <summary>
    /// Forcess checking if execute is allowed
    /// </summary>
    /// <param name="parameter"></param>
    /// <returns></returns>
    public bool CanExecute(object parameter)
    {
        return _canExecute.Invoke();
    }

    public void Execute(object parameter)
    {
        _action();
    }
}

Alguém sabe uma maneira simples para se certificar de que o foco é perdido ou uma forma de acionar o conjunto de eventos de propriedades vinculáveis

2-way-object-databinding c# mvvm prism
2021-11-23 08:41:19
1

Melhor resposta

1

Você deve usar UpdateSourceTrigger=PropertyChanged

<TextBox Text="{Binding TextValue, UpdateSourceTrigger=PropertyChanged}"/>

2021-11-23 08:59:41

Na verdade, clicando em um botão significa que a perda de foco para a caixa de texto, então ele deve ter atualizado.
Haukinger

@Haukinger hmm...
dmitriy

@Haukinger, eu pensei que era o caso, mas, infelizmente, não, ele não acionar a perder o foco
Just another Dev

@Haukinger, eu me pergunto se é porque a barra de ferramentas e a forma de texto são em separado controles? o que não faz sentido....
Just another Dev

@JustanotherDev ele definitivamente poderia ser a fonte se a barra de ferramentas controlos de formulário e individuais, de ver os modelos.
Jeffery

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................