Метод Dispatcher.BeginInvoke выполняет делегат асинхронно в потоке, с которым связан Dispatcher
. так что в вашем коде вы получите два значения. один «тест», а другой - исходное значение SMENumber
, поскольку окна сообщений отображаются асинхронно друг с другом, и нет никакой гарантии, какой из них («тест» или оригинал) будет отображаться первым.
сделайте ваш код рабочим, используя async
и await
. как показано ниже: (Этот код просто показывает, что SMENumber
обновляется правильно).
private async void UserControlThingHappened(object sender, EventArgs e)
{
DecreaseSmeCount();
foreach (object child in smePanel.Children)
{
if (child is SMEInfoUserControl control)
{
await Dispatcher.BeginInvoke(new System.Action(() =>
{
control.SMENumber = "test";
MessageBox.Show(control.SMENumber);
}), DispatcherPriority.Normal);
MessageBox.Show(control.SMENumber);
}
}
}
В обоих окнах сообщений должен отображаться «тест».
Для обновления textBlocks убедитесь, что ваша привязка работает правильно и используйте этот код:
private void UserControlThingHappened(object sender, EventArgs e)
{
DecreaseSmeCount();
foreach (object child in smePanel.Children)
{
if (child is SMEInfoUserControl control)
{
Dispatcher.BeginInvoke(new System.Action(() =>
{
control.SMENumber = "test";
}), DispatcherPriority.Normal);
}
}
}
Если ваша привязка будет в порядке, то текстовые блоки должны быть обновлены.
Надеюсь, это поможет вам решить вашу проблему.