WPF, MVVM Cómo recoger los cambios de texto en el Botón haga Clic en

0

Pregunta

Estoy trabajando en un proyecto de WPF con MVVM y me encontré con un problema de no recoger el último cambio de texto cuando hago clic en el botón guardar.

Mis componentes son el programa de instalación como esta:

  1. Una barra de herramientas ver con la barra de herramientas de la máquina virtual, que tiene el botón guardar. botón haga clic en evento está enlazado a un Icommand.
  2. Una vista de formulario con un montón de campos de texto, vinculada a un sepreate VM.
  3. la barra de herramientas de la vista y la vista formulario se encuentran en archivos separados.
  4. todos mis VMs hereda de BindableBase (la parte del Prisma.MvvM paquete)

De clic de botón, voy a tomar los valores de la forma de la VM y guardarlos... simple y stragight adelante. Todo está bien, excepto que al momento de la edición del último campo, hacer clic en el botón guardar no se activa el perder el foco del evento. Por lo tanto, el Conjunto de propiedades de evento no se activa. Voy a tener que hacer clic de distancia de los campos después de la edición, a continuación, haga clic en el botón. Aquí está mi código:

 public class ViewModel: BindableBase
{
    private string _someText;

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

en la vista XAML:

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

en la barra de herramientas XAML:

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

ViewModel de la barra de herramientas:

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

código para 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();
    }
}

¿Alguien sabe una manera limpia para asegurarse de que se pierde el enfoque o una manera para activar el conjunto de eventos de las propiedades enlazables

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

Mejor respuesta

1

Usted debe utilizar UpdateSourceTrigger=PropertyChanged

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

2021-11-23 08:59:41

De hecho, haciendo clic en un botón, significa la pérdida de enfoque para el cuadro de texto, por lo que debe de haber actualizado.
Haukinger

@Haukinger hmm...
dmitriy

@Haukinger, yo pensaba que era el caso, pero, lamentablemente, no, no desencadenar el perder el foco
Just another Dev

@Haukinger, me pregunto si es porque la barra de herramientas y la forma de texto están en controles separados? no tiene sentido, aunque....
Just another Dev

@JustanotherDev definitivamente podría ser la fuente si la barra de herramientas controles de formulario individual de modelos de vista.
Jeffery

En otros idiomas

Esta página está en otros idiomas

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