0

C# UWP Windows 10. В классе, который реализует INotifyPropertyChanged, есть некая строка к которой привязан TextBlock, работает все отлично, но в одном из случаев строке присваивается значения из другого потока Task и UI не реагирует на изменения.

Собственно вопрос - как заставить UI обновиться?

Пробовал присваивать значение через Dispatcher окна - не работает.

UPD

Вызов обновления переменной происходит в другом потоке:

...    
await Window.Current.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        Balance = Account.GetBalance();
    });
...

Код сеттера

public string Balance
{
    get{...}
    set
    {
        _balance = value;
        NotifyPropertyChanged();
    }
}

Все компилируется, нету никаких ошибок, просто когда код выполняется в Taskе - обновление UI не происходит, по дебаггеру значение меняется.

SYL
  • 367
  • http://ru.stackoverflow.com/questions/418461/%d0%a0%d0%b0%d0%b1%d0%be%d1%82%d0%b0-%d1%81-%d0%ba%d0%be%d0%bd%d1%82%d1%80%d0%be%d0%bb%d0%b0%d0%bc%d0%b8-%d0%b8%d0%b7-%d1%84%d0%be%d0%bd%d0%be%d0%b2%d0%be%d0%b3%d0%be-%d0%bf%d0%be%d1%82%d0%be%d0%ba%d0%b0 – Serginio May 05 '16 at 13:34
  • @Serginio как это относится к INotifyPropertyChanged и DataBinding? Тем более у меня нету доступа к форме из модели, взаимодействие в эту сторону возможно только через ивенты – SYL May 05 '16 at 13:37
  • @SYL: Думаю, самым прямым. – VladD May 05 '16 at 13:57
  • @SYL: «Пробовал присваивать значение через Dispatcher окна - не работает». Что это за описание, вы ж программист, надеюсь? Давайте код, и вместо «не работает» точное описание ошибки (exception? не компилируется?). И да, если Task у вас бежит в другом потоке, то: (1) вы должны себе поставить вопрос, почему в другом, правильно ли это? (2) если всё же правильно, Dispatcher — верный путь, скорее всего ошибка в вашем коде. – VladD May 05 '16 at 13:59
  • Это относится к тому, что ты должен вызвать изменение в потоке UI – Serginio May 05 '16 at 14:00
  • @VladD Обновил вопрос – SYL May 05 '16 at 14:22
  • @SYL: О, это уже намного лучше. Что-то я сомневаюсь в Window.Current, правильно ли оно сработает. Попробуйте разбить на куски: var w = Window.Current; var d = w.Dispatcher; ..., и посмотрите, то ли окно вам приходит. – VladD May 05 '16 at 14:27
  • @VladD по идее то, возвращается Windows.UI.Core.Dispatcher. – SYL May 05 '16 at 14:30
  • @SYL: Вопрос в том, тот ли это диспетчер. Может быть, вы оказываетесь не в том потоке, и у него свой диспетчер. И ещё, гляньте всё же, не бросается ли где-нибудь исключение. Не может что-то просто так молча не работать, это ж не PHP. – VladD May 05 '16 at 14:32
  • @SYL: Поставьте breakpoint в сеттере свойства, и проверьте, (1) вызывается ли он вообще, (2) если да, то в главном ли потоке. – VladD May 05 '16 at 14:33
  • @VladD Вызывается. Так же пробовал использовать Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher и через ссылку на окно в котором находится текстовое поле App.shell.Dispatcher - все тот же результат – SYL May 05 '16 at 14:35
  • Я для этих целей использую SynchronizationContext http://infostart.ru/public/417830/ правда там проще использовать put – Serginio May 05 '16 at 14:54
  • @Vlad В общем полная лажа – SYL May 05 '16 at 15:13

0 Answers0