C# PropertyChangedCallback在绑定组合框中显示新值之前激发
我将DependencyProperty绑定到组合框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
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如果你愿意写一个“正式”答案,我很乐意“正式”接受它:)