WPF MVVM Come prendere le modifiche al testo sul Pulsante fare Clic su

0

Domanda

Sto lavorando su un progetto WPF con MVVM e ho riscontrato un problema di non raccogliere l'ultima modifica di testo facendo clic sul pulsante salva.

I miei componenti sono di configurazione come questa:

  1. Una barra degli strumenti barra degli strumenti vista con VM, che è il pulsante salva. pulsante fare clic su evento è associato a un Icommand.
  2. La visualizzazione form con una serie di campi di testo, legato ad un sepreate VM.
  3. visualizzazione della barra degli strumenti e la forma vista in file separati.
  4. tutte le macchine virtuali eredita da BindableBase (parte del Prisma.MvvM pacchetto)

Su clic del pulsante, io prenderò i valori del modulo di VM e salvarli... semplice e stragight in avanti. Tutto bene, tranne che su modifica l'ultimo campo, fare clic sul pulsante salva non fa scattare l'perdere la concentrazione evento. Pertanto, l'Insieme di proprietà non viene generato l'evento. Dovrò fare clic di distanza dai campi dopo le modifiche, quindi fare clic sul pulsante. Ecco il mio codice:

 public class ViewModel: BindableBase
{
    private string _someText;

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

in vista XAML:

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

nella barra degli strumenti XAML:

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

ViewModel per la barra degli strumenti:

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

codice 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();
    }
}

Qualcuno sa un modo pulito per assicurarsi che si perde il focus o un modo per attivare l'evento di proprietà associabili

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

Migliore risposta

1

Si dovrebbe usare UpdateSourceTrigger=PropertyChanged

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

2021-11-23 08:59:41

Infatti, cliccando su un pulsante si intende la perdita di messa a fuoco per la casella di testo, quindi non dovrebbe avere aggiornato.
Haukinger

@Haukinger hmm...
dmitriy

@Haukinger, ho pensato che era il caso, ma purtroppo, no, non attivare il perdere la messa a fuoco
Just another Dev

@Haukinger, mi chiedo se è perché la barra degli strumenti e la forma di testo sono in separata per i controlli? il che non ha senso però....
Just another Dev

@JustanotherDev potrebbe sicuramente essere la fonte se la barra degli strumenti e i controlli del modulo sono i singoli modelli di visualizzazione.
Jeffery

In altre lingue

Questa pagina è in altre lingue

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