Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.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# PropertyChangedCallback在绑定组合框中显示新值之前激发_C#_Wpf_Combobox_Dependency Properties - Fatal编程技术网

C# PropertyChangedCallback在绑定组合框中显示新值之前激发

C# PropertyChangedCallback在绑定组合框中显示新值之前激发,c#,wpf,combobox,dependency-properties,C#,Wpf,Combobox,Dependency Properties,我将DependencyProperty绑定到组合框 public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.Register("SelectedItem", typeof(MyViewModel), typeof(MySelectionViewModel), new UIPropertyMetadata(null, new Property

我将DependencyProperty绑定到组合框

public static readonly DependencyProperty SelectedItemProperty =
       DependencyProperty.Register("SelectedItem",
       typeof(MyViewModel), typeof(MySelectionViewModel),
       new UIPropertyMetadata(null, new  PropertyChangedCallback(OnSelectedXyPropertyChanged)));
所有这些都可以正常工作,但在OnSelectedXyPropertyChanged中显示消息框时,后面的组合框将显示旧值。我希望显示新值,因为我认为如果用户看到旧值和与新值对应的消息,就会感到困惑

private static void OnSelectedXyPropertyChanged (DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
   ...
   MessageBoxResult result = MessageBox.Show("Ask something", "Caption", MessageBoxButton.YesNo);
   ...
}

如何更改以获得预期的行为?

是的,如果UI不一致,用户将有中断体验

打开消息框是线程生存期内的一个模式事件,因此在消息框关闭之前,线程将被阻塞。在您的情况下,消息框是在WPF绑定引擎作为参与者的事件管道期间引发的,因此在消息框关闭之前,UI不会得到更新

解决此问题的最快方法是通过Dispatcher调度消息框。这将允许事件管道完成。这方面的指示性代码是

Application.Current.Dispatcher.BeginInvoke(...)

这样做会将代理放入一个优先级队列,该队列将在“时机成熟”时执行。

您是否在事件处理程序中提升messagebox?@Gayot Fow是的,我添加了第二个代码片段以进行澄清。您是否可以尝试将其放入调度程序,看看结果是否有所改善?@Gayot Fow非常感谢!就是这样:我尝试了
Application.Current.Dispatcher.BeginInvoke(…)
,现在它工作得很好。@Gayot Fow如果你愿意写一个“正式”答案,我很乐意“正式”接受它:)