Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 文本框LostFocus事件始终在.net中的按钮单击事件之前引发?_C#_.net_Xaml_Uwp - Fatal编程技术网

C# 文本框LostFocus事件始终在.net中的按钮单击事件之前引发?

C# 文本框LostFocus事件始终在.net中的按钮单击事件之前引发?,c#,.net,xaml,uwp,C#,.net,Xaml,Uwp,我有下面的场景。用户在文本框中输入数量并点击按钮提交。文本框在“LostFocus”上更新其ViewModel,按钮在单击时执行命令。为了使事情更加复杂,这两个事件都会触发异步操作,这些操作通过信号量lim进行同步(在命令执行之前,应该在LostFocus上更新数据)。在极少数情况下,我怀疑Clicked事件是在LostFocus之前引发的。这可能吗?我想知道在这种情况下,是否可以保证FocusLost事件总是在按钮单击事件之前引发 根据测试,LostFocus在单击事件之前被触发,但由于它是异

我有下面的场景。用户在文本框中输入数量并点击按钮提交。文本框在“LostFocus”上更新其ViewModel,按钮在单击时执行命令。为了使事情更加复杂,这两个事件都会触发异步操作,这些操作通过信号量lim进行同步(在命令执行之前,应该在LostFocus上更新数据)。在极少数情况下,我怀疑Clicked事件是在LostFocus之前引发的。这可能吗?我想知道在这种情况下,是否可以保证FocusLost事件总是在按钮单击事件之前引发

根据测试,LostFocus在单击事件之前被触发,但由于它是异步的,所以有可能在LostEvent完成之前被处理。如果要确保顺序正确,可以使用一些同步对象,例如。示例可以如下所示:

AsyncAutoResetEvent resetEvent = new AsyncAutoResetEvent();

private async void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
    Debug.WriteLine("Starting lost focus");
    await Task.Delay(3000);
    resetEvent.Set();
    Debug.WriteLine("Leaving lost focus");
}

private async void Button_Click(object sender, RoutedEventArgs e)
{
    Debug.WriteLine("Clicking button");
    await resetEvent.WaitAsync();
    Debug.WriteLine("Finishing with click event");
}

为什么更新OnLostFocus是一项要求?最简单的解决方案是将绑定触发器设置为PropertyChangedI,我不会用自己的代码来更新LostFocus。控件通过编译绑定到其视图模型进行绑定。LostFocus的更新是默认行为,这就是我提到它的原因。谢谢你的回答。我稍后会检查的。乍一看,您的同步方式似乎与我的类似。我以前从未听说过AsyncAutoResteEvent,但我也要检查一下。我认为你是对的,在我的场景中,LostFocus总是在单击之前引发的。我们遇到的问题肯定还有另一个原因。