WPF MVVM Как получить изменения текста при нажатии кнопки

0

Вопрос

Я работаю над проектом WPF с MVVM, и я столкнулся с проблемой отсутствия последнего изменения текста при нажатии кнопки "Сохранить".

Мои компоненты настроены следующим образом:

  1. Вид панели инструментов с виртуальной машиной панели инструментов, на которой есть кнопка сохранить. событие нажатия кнопки привязано к команде Icommand.
  2. Представление формы с кучей текстовых полей, привязанных к отдельной виртуальной машине.
  3. представление панели инструментов и представление формы находятся в отдельных файлах.
  4. все мои виртуальные машины наследуются от BindableBase (часть пакета Prism.MvvM).

По щелчку кнопки я возьму значения из формы VM и сохраню их... просто и прямо вперед. Все хорошо, за исключением того, что при редактировании последнего поля нажатие кнопки сохранить не вызывает события потери фокуса. Таким образом, событие набора свойств не запускается. Мне придется щелкнуть по полям после редактирования, а затем нажать на кнопку. Вот мой код:

 public class ViewModel: BindableBase
{
    private string _someText;

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

в представлении XAML:

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

на панели инструментов XAML:

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

Модель представления для панели инструментов:

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

код для базового командора:

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

Кто-нибудь знает чистый способ убедиться, что фокус потерян, или способ инициировать событие set привязываемых свойств

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

Лучший ответ

1

Вы должны использовать UpdateSourceTrigger=PropertyChanged

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

2021-11-23 08:59:41

На самом деле нажатие кнопки означает потерю фокуса для текстового поля, поэтому оно должно было обновиться.
Haukinger

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

@Haukinger, я думал, что это так, но, к сожалению, нет, это не приводит к потере фокуса
Just another Dev

@Haukinger, интересно, это потому, что панель инструментов и текстовая форма находятся в отдельных элементах управления? что, однако, не имеет смысла....
Just another Dev

@JustanotherDev это определенно может быть источником, если панель инструментов и элементы управления формами имеют отдельные модели представления.
Jeffery

На других языках

Эта страница на других языках

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