WPF MVVM Comment ramasser des modifications apportées au texte sur le Bouton Cliquez sur

0

La question

Je suis en train de travailler sur un projet WPF avec MVVM et j'ai rencontré un problème de ne pas décrocher le dernier changement de texte lorsque je clique sur le bouton enregistrer.

Mes composants sont configurés comme ceci:

  1. Une barre d'outils de la vue avec la barre d'outils de la machine virtuelle, qui a le bouton enregistrer. bouton cliquez sur l'événement est lié à un Icommand.
  2. Une vue de formulaire avec un tas de champs de texte, lié à un sepreate VM.
  3. la barre d'outils de la vue et la vue de forme sont sous la forme de plusieurs fichiers.
  4. tous mes VMs hérite de BindableBase (partie du Prisme.MvvM paquet)

Sur clic du bouton, je vais prendre les valeurs à partir de la forme de la VM et de les enregistrer... simple et stragight de l'avant. Tout est bien, sauf que lors de l'édition du dernier champ, en cliquant sur le bouton enregistrer ne déclenche pas le perdre de vue l'objectif de l'événement. Par conséquent, la propriété de l'événement n'est pas déclenché. Je vais devoir cliquer sur les champs après la modification, puis cliquez sur le bouton. Voici mon code:

 public class ViewModel: BindableBase
{
    private string _someText;

    public string SomeText
    {
        get { return _someText; }
        set { SetProperty(ref _someText, value); }
    }
}

dans la vue de code XAML:

  <TextBox Text="{Binding SomeText}"/>

dans la barre d'outils XAML:

<Button Command="{Binding SaveCommand}" ToolTip="Save">
</Button>

ViewModel de la barre d'outils:

 public class ToolbarViewModel : BindableBase
{
    private ICommand _saveCommand;
    public ICommand SaveCommand
    {
        get
        {
            return _saveCommand ?? (_saveCommand = new BaseCommandHandler(() => { 
                //Save code
            }, () => true));
        }
    }
}

code pour 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();
    }
}

Quelqu'un sait-il un moyen propre à assurez-vous que la cible est perdue ou un moyen de déclencher la définition de l'événement de l'propriétés qui peuvent être liées

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

La meilleure réponse

1

Vous devez utiliser UpdateSourceTrigger=PropertyChanged

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

2021-11-23 08:59:41

En fait, en cliquant sur un bouton, une perte d'intérêt pour la zone de texte, de sorte qu'il devrait avoir mis à jour.
Haukinger

@Haukinger hmm...
dmitriy

@Haukinger, je pensais que c'était le cas, mais malheureusement, non, il ne marche pas déclencher la perdre le focus
Just another Dev

@Haukinger, je me demande si c'est parce que la barre d'outils et la forme du texte sont séparées des contrôles? qui n'a pas de sens si....
Just another Dev

@JustanotherDev il pourrait certainement être la source si la barre d'outils et les contrôles de formulaire individuel des modèles de vue.
Jeffery

Dans d'autres langues

Cette page est dans d'autres langues

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