Já jsem pracoval na projektu WPF s MVVM a já jsem narazil na problém, že není zvedl poslední text změnit, když jsem klepněte na tlačítko uložit.
Moje komponenty jsou nastavení, jako je tento:
- Panel nástrojů zobrazení s toolbar VM, který má tlačítko uložit. tlačítko klepněte na událost je vázán na Icommand.
- Forma zobrazení s partou textová pole, vázané na sepreate VM.
- na panelu nástrojů zobrazení a zobrazení formuláře jsou v samostatných souborech.
- všechny mé VMs dědí z BindableBase (část Hranolu.MvvM balení)
Na tlačítko klikněte, vezmu hodnoty z formuláře VM a uložit je... jednoduché a stragight dopředu. Všechno je v pořádku, kromě toho, že se po editaci poslední pole, kliknutím na tlačítko uložit nevyvolává ztratit zaměření akce. Proto ubytování není spuštěna událost. Budu muset klepněte na tlačítko pryč z polí, po editaci klikněte na tlačítko. Tady je můj kód:
public class ViewModel: BindableBase
{
private string _someText;
public string SomeText
{
get { return _someText; }
set { SetProperty(ref _someText, value); }
}
}
v zobrazení XAML:
<TextBox Text="{Binding SomeText}"/>
v panelu nástrojů XAML:
<Button Command="{Binding SaveCommand}" ToolTip="Save">
</Button>
ViewModel pro toolbar:
public class ToolbarViewModel : BindableBase
{
private ICommand _saveCommand;
public ICommand SaveCommand
{
get
{
return _saveCommand ?? (_saveCommand = new BaseCommandHandler(() => {
//Save code
}, () => true));
}
}
}
kód pro 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();
}
}
Ví někdo, čistý způsob, jak ujistěte se, že soustředit se je ztracena nebo způsob, jak vyvolat nastavit událost bindable properties