ReactiveUI: свойство не обновляется

Не уверен, что я делаю неправильно:

       private at = "0";
       public string AT
        {
            get
            {
                return aT;
            }
            set
            {
                aT = value;
                this.RaiseAndSetIfChanged(ref aT, value);
            }
        }

Установив это в ViewModel с помощью AT = "Something", вызывается Raise, и представление устанавливается изначально. Однако, поскольку AT вызывается постоянно (по крайней мере, одно обновление в секунду), он не обновляется после начального набора (исходное значение aT).

this.WhenAnyValue(x => x.ViewModel.AT).Subscribe(x => Debug.WriteLine("Change in AT:" + x)); // using this to debug

Кажется, какое-то время это работает:

        set
        {
            aT = value;
            this.RaisePropertyChanged();
        }

Однако после успешного получения одного значения (помимо начального набора) происходит сбой! Что я делаю неправильно?

Редактировать:

Это свойство изменяется в обработчике асинхронного события. Свойство изменяется каждый раз, когда я делаю точку останова. Это происходит примерно 1 раз в секунду:

private async void ValueChanged(Something sender, SomeArgs args)
        {
            //Computation code here
            AT= string.Format("{0:0.0####}", ATOrigin);
            // Property is set - I checked
           // More code here
        }

person Tyress    schedule 12.04.2016    source источник
comment
Помимо написания it crashes, вы также должны включить в вопрос сообщение об ошибке.   -  person pmbanka    schedule 12.04.2016


Ответы (1)


Согласно имени, RaiseAndSetIfChanged установит поле, переданное по ссылке, если новое значение отличается.

Вы устанавливаете значение поля перед вызовом этого, поэтому никаких изменений не происходит. Удалите это, и оно будет работать:

private string at;

public string AT 
{
    get { return at; }
    set { this.RaiseAndSetIfChanged(ref at, value); }
}

В документации есть несколько примеров.

person Charles Mager    schedule 12.04.2016
comment
Спасибо за ваш ответ, но, к сожалению, это все еще не работает для меня. Точки останова показывают, изменилось ли поле, независимо от того, установлено оно изначально или нет. View не видит изменения, как и ViewModel, когда я делаю this.WhenAnyValue(x => x.AT).Subscribe(x => Debug.WriteLine("Change in AT (VM): " + x)); . Я даже добавил ObserveOn(RxApp.MainThreadScheduler), но без изменений - person Tyress; 12.04.2016
comment
Вам необходимо предоставить минимально воспроизводимый пример, демонстрирующий вашу проблему. Взяв ваш код с моим изменением в базовом приложении WPF с таймером, который устанавливает свойство каждую секунду, я каждую секунду получаю строку, записываемую в консоль. - person Charles Mager; 12.04.2016
comment
Несколько лет спустя я столкнулся с той же проблемой, трудно сделать воспроизводимый пример, потому что это происходит не всегда. Обычно я подписываюсь на событие PropertyChanged (PropertyChanged += ...), и оно хорошо уведомлено, но this.WhenAnyValue не срабатывает все время - person polkduran; 04.12.2020