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

时间:2014-11-20 12:07:04

标签: wpf

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

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

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

我可以在命令调用之前以某种方式将数据从视图提取到viewmodel,还是可以在调用命令之前调用textbox lostfocus事件。

提前致谢....

5 个答案:

答案 0 :(得分:0)

直接在TextBox上绑定键/手势并失去焦点。然后让手势遍历Window以进行保存。 :)

答案 1 :(得分:0)

您需要在TextBox的BindingExpression上调用UpdateSource,但您的viewModel无权访问TextBox。所以你需要在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"/>

然后获取参数以查找与参数值具有相同标记的文本框。

myViewModel.UpdateTextSource += t =>
{
    var tb = GetTextBoxWithTag(t);//implement this function
    BindingExpression be = tb.GetBindingExpression(MainWindow.TextProperty);
    be.UpdateSource();
};

答案 2 :(得分:0)

您可以在相关PreviewKeyDown上使用System.Windows.IInputElement处理程序。在您的情况下,这将是实现CTRL + S的Wpf控件。 在处理程序中,检查CTRL+S按键,如果是,请将您的UIData“拉”到视图模型中。

答案 3 :(得分:0)

感谢大家的宝贵意见。

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

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

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

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

所以在我的命令执行之前,文本框将失去焦点,输入的文本框值将反映在viewmodel ..... :)中:)

答案 4 :(得分:0)

我在https://stackoverflow.com/a/47309346/4554937回答了类似的问题。我编写了更新聚焦键盘元素的绑定源的命令,并在保存数据之前执行它。

我的CommitValueCommand

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