Pracuję nad projektem WPF z MVVM, i spotkałem się z problemem braku ostatniej zmiany tekstu po naciśnięciu przycisku "Zapisz".
Moje elementy są skonfigurowane w następujący sposób:
- Widok paska narzędzi w maszynie wirtualnej pasku narzędzi, na której znajduje się przycisk zapisz. zdarzenie naciśnięcia przycisku przypisano do zespołu Icommand.
- Widok formularza z grupą pól tekstowych powiązanych z osobnej maszynie wirtualnej.
- widok paski narzędzi i widok formularza znajdują się w oddzielnych plikach.
- wszystkie moje maszyny wirtualne są dziedziczone od BindableBase (część pakietu Prism.MvvM).
Po kliknięciu przycisku wezmę wartości z formularza VM i zachowam je... proste i prosto do przodu. Wszystko dobrze, z wyjątkiem tego, że podczas edycji ostatniego pola naciśnięcie przycisku zapisz powoduje zdarzenia utraty ostrości. W ten sposób wydarzenie zestawu właściwości nie uruchamia się. Muszę kliknąć na polach po edycji, a następnie nacisnąć przycisk. Oto mój kod:
public class ViewModel: BindableBase
{
private string _someText;
public string SomeText
{
get { return _someText; }
set { SetProperty(ref _someText, value); }
}
}
w widoku XAML:
<TextBox Text="{Binding SomeText}"/>
na pasku narzędzi XAML:
<Button Command="{Binding SaveCommand}" ToolTip="Save">
</Button>
Model widoku na pasku narzędzi:
public class ToolbarViewModel : BindableBase
{
private ICommand _saveCommand;
public ICommand SaveCommand
{
get
{
return _saveCommand ?? (_saveCommand = new BaseCommandHandler(() => {
//Save code
}, () => true));
}
}
}
kod do podstawowego komandora:
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();
}
}
Czy ktoś wie czysty sposób, aby upewnić się, że ostrość zostanie zgubiony, lub sposób wyzwolić zdarzenie set привязываемых właściwości