【问题标题】:Pull data from view into viewmodel before command is executed WPF在执行命令之前将数据从视图拉入视图模型 WPF
【发布时间】:2014-11-20 12:07:04
【问题描述】:

我有文本框。它的 updatesourcetrigger 属性设置为 lostfocus。我不想将其设置为 proportychanged。

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

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

我可以在命令调用之前以某种方式将数据从视图拉到视图模型吗,或者我可以在调用命令之前调用文本框 lostfocus 事件。

提前谢谢....

【问题讨论】:

    标签: wpf


    【解决方案1】:

    直接在您的文本框上绑定键/手势并失去焦点。然后让手势遍历到 Window 进行保存。 :)

    【讨论】:

      【解决方案2】:

      您需要在 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();
      };
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          感谢大家的宝贵意见。

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

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

          private void MoveFocus()
          {
            var focusElement = KeyBoard.FocusElement as UIElement;
          
            if(focusElement != null)
            {
              focusElement.MoveFocus(FocusNavigationDirection.Next); 
            }
          }
          

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

          【讨论】:

            【解决方案5】:

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

            我的 CommitValueCommand 片段

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-06-10
              • 2012-10-13
              • 2014-05-01
              • 2021-06-20
              • 2017-01-24
              相关资源
              最近更新 更多