按下按钮时如何强制文本框上的焦点丢失

时间:2016-12-08 21:46:31

标签: c# wpf mvvm prism

我有一个非常大的wpf应用程序,它是使用prism框架和MVVM概念构建的,如果用户在文本框中键入更改并按下接受按钮而不先离开文本框,则会导致按钮操作无法接收更改文本框中的值。我的viewmodel有以下按钮代码

private DelegateCommand<string> _myButtonAction;
public ICommand MyButtonAction
{
   get
   {
      if (_myButtonAction== null)
      {
         _myButtonAction= DelegateCommand<string>.FromAsyncHandler(
                    MyFunction,
                    s => true);
      }

      return _myButtonAction;
   }
}

private Task MyFunction(string arg)
{
   // this event calls a button.focus in the view 
   EventAggregator.GetEvent<FocusObject>().Publish("");
   // this doesn't work either
   Keyboard.ClearFocus();
   using (new WaitCursor("my function"))
   {
       // do some stuff
   }
   return Task.FromResult<object>(null);
}

尽管尝试使用Keyboard.ClearFocus()并使用消息事件来调用MyButton.Focus();在视图中,一旦我使用此方法,似乎没有任何东西似乎触发文本框失去焦点。有没有其他人对如何从视图模型强制更新一堆文本框(比方说100+)有任何建议?

1 个答案:

答案 0 :(得分:1)

不会告知TextBox的数据来源更新。

我发现您担心使用UpdateSourceTrigger=PropertyChanged作为验证原因。但是,我相信这仍是一个很好的解决方案。为了防止TextBoxes在每次击键时强制进行验证,您可以在绑定中添加Delay

例如:

<TextBlock Text="{Binding someProperty, UpdateSourceTrigger=PropertyChanged, Delay=100}" />