WPF MVVM Jak uzyskać zmiany tekstu po naciśnięciu przycisku

0

Pytanie

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:

  1. 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.
  2. Widok formularza z grupą pól tekstowych powiązanych z osobnej maszynie wirtualnej.
  3. widok paski narzędzi i widok formularza znajdują się w oddzielnych plikach.
  4. 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

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

Najlepsza odpowiedź

1

Musisz użyć UpdateSourceTrigger=PropertyChanged

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

2021-11-23 08:59:41

W rzeczywistości naciśnięcie przycisku oznacza utratę ostrości dla pola tekstowego, więc ono powinno było zostać zaktualizowany.
Haukinger

@Хаукингер hmm...
dmitriy

@Haukinger, myślałem, że to tak, ale, niestety, nie, to nie prowadzi do utraty ostrości
Just another Dev

@Haukinger, co ciekawe, to dlatego, że pasek narzędzi i tekstowa forma znajdują się w poszczególnych elementach sterowania? co jednak, nie ma sensu....
Just another Dev

@JustanotherDev to na pewno może być źródłem, jeśli pasek narzędzi i elementów sterowania formami mają poszczególne modele reprezentacji.
Jeffery

W innych językach

Ta strona jest w innych językach

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