在执行WPF命令之前,将数据从视图拉入viewmodel

在执行WPF命令之前,将数据从视图拉入viewmodel,wpf,Wpf,我有一个文本框。其updatesourcetrigger属性设置为lostfocus。我不想把它设成比例改变 现在让我们假设,我的WPF表单已经脏了,用户正在更新文本框。现在,当焦点仅在文本框中时,用户直接按CTRL+S键(即调用保存命令) 现在,调用save命令时,更新的文本框值不会反映在viewmodel中。(即,我的视图和viewmodel数据不同步。) 我可以在调用命令之前以某种方式将数据从视图拉到viewmodel,或者在调用命令之前调用textbox lostfocus事件 提前感谢

我有一个文本框。其updatesourcetrigger属性设置为lostfocus。我不想把它设成比例改变

现在让我们假设,我的WPF表单已经脏了,用户正在更新文本框。现在,当焦点仅在文本框中时,用户直接按CTRL+S键(即调用保存命令)

现在,调用save命令时,更新的文本框值不会反映在viewmodel中。(即,我的视图和viewmodel数据不同步。)

我可以在调用命令之前以某种方式将数据从视图拉到viewmodel,或者在调用命令之前调用textbox lostfocus事件


提前感谢….

将按键/手势直接绑定到文本框上,并避免失去焦点。然后让手势向上移动到窗口进行保存。:)

您需要在文本框的BindingExpression上调用UpdateSource,但您的viewModel无权访问文本框。因此,您需要在viewModel中创建一个事件来执行此操作

在您的视图中编写以下代码:

myViewModel.UpdateTextSource += () =>
{
    BindingExpression be = textBox1.GetBindingExpression(MainWindow.TextProperty);
    be.UpdateSource();
};
并在命令内激发此事件

if(UpdateTextSource != null)
    UpdateTextSource();
如果需要更新不同的文本框,则可以向事件添加参数:

if(UpdateTextSource != null)
    UpdateTextSource(TextProperty.Name);
在视图中,将具有此功能的所有文本框的标记设置为属性的名称

<TextBox Text="{Binding PhoneNO}" Tag="PhoneNO"/>

您可以在相关的
System.Windows.IInputElement
上使用
PreviewKeyDown
处理程序。在您的例子中,这将是实现CTRL+S的Wpf控件。
在处理程序中,检查是否按了
CTRL+S
键,如果是,则将UIData“拉”到viewmodel中。

感谢大家的宝贵输入

我已经用MoveFocus方法解决了这个问题

在我看来,在执行命令之前,我调用了以下函数:

private void MoveFocus()
{
  var focusElement = KeyBoard.FocusElement as UIElement;

  if(focusElement != null)
  {
    focusElement.MoveFocus(FocusNavigationDirection.Next); 
  }
}

因此,在执行我的命令之前,textbox将失去焦点,输入的textbox值将反映在viewmodel中……:):)

我回答中的类似问题。我编写了一个命令,用于更新聚焦键盘元素的绑定源,并在保存数据之前执行它

这是我的一个命令

public void Execute(object parameter)
{
    if (Keyboard.FocusedElement is TextBox textBox)
    {
        BindingOperations.GetBindingExpression(textBox, TextBox.TextProperty).UpdateSource();
    }
}
public void Execute(object parameter)
{
    if (Keyboard.FocusedElement is TextBox textBox)
    {
        BindingOperations.GetBindingExpression(textBox, TextBox.TextProperty).UpdateSource();
    }
}