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:
- Una barra degli strumenti barra degli strumenti vista con VM, che è il pulsante salva. pulsante fare clic su evento è associato a un Icommand.
- La visualizzazione form con una serie di campi di testo, legato ad un sepreate VM.
- visualizzazione della barra degli strumenti e la forma vista in file separati.
- 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