WPF MVVM, Jak vyzvednout text se změní na Tlačítko, Klepněte na tlačítko

0

Otázka

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:

  1. 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.
  2. Forma zobrazení s partou textová pole, vázané na sepreate VM.
  3. na panelu nástrojů zobrazení a zobrazení formuláře jsou v samostatných souborech.
  4. 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

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

Nejlepší odpověď

1

Byste měli použít UpdateSourceTrigger=PropertyChanged

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

2021-11-23 08:59:41

Ve skutečnosti, kliknutím na tlačítko, znamená ztrátu zaměření na textové pole, takže to by měl mít aktualizovaný.
Haukinger

@Haukinger hmm...
dmitriy

@Haukinger, myslel jsem, že to byl ten případ, ale bohužel, ne, to není vyvolat ztrátu pozornosti
Just another Dev

@Haukinger, zajímalo by mě, jestli je to proto, že panel nástrojů a textové podobě jsou v oddělené kontroly? což nedává smysl, i když....
Just another Dev

@JustanotherDev určitě by to mohl být zdroj, pokud panel nástrojů a ovládací prvky formuláře mají individuální view modely.
Jeffery

V jiných jazycích

Tato stránka je v jiných jazycích

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