наблюдать за изменениями в другой модели представления

Я использую реактивный интерфейс с динамическими данными. Он отлично работает, если все изменения обрабатываются в одной и той же модели представления.

Проблема, с которой я сталкиваюсь, заключается в том, что одно из полей в классе фактически исходит из базы данных, это поле совместно используется двумя моделями представления, если я обновляю его в одной модели представления, я хочу, чтобы оно уведомляло об изменениях в другой модели представления. Как я это сделал.

Раньше в типичной событийно-ориентированной модели я просто подписывался на событие.

private string _Name;
    [CategoryAttribute("NotUsed "),
    DescriptionAttribute("DisplayName"),
    DisplayName("Name"), Browsable(true) ]
    [ReadOnly(true)]
    public string Name
    {
        get { return _Name; }
        set
        {
            this.RaiseAndSetIfChanged(ref _Name, value);
            this.RaiseValidation(nameof(_Name));

        }
    }

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


person Jason    schedule 12.09.2019    source источник


Ответы (1)


Я не эксперт Rx или ReactiveUI, но я бы сделал это, создав службу, которая извлекает ваши данные из базы данных. Затем каждая ViewModel будет извлекать этот класс из службы как Observable. Когда одна ViewModel изменяет класс, вам необходимо уведомить службу о внесении изменений. Затем сервис будет рассылать уведомления всем подписанным ViewModels о том, что этот класс изменился.

public class DataService
{
   private BehaviorSubject<MyClass> subject;
   public IObservable<MyClass> => subject.AsObservable();

   public DataService()
   {
      // code to get the data from database and initialize the BehaviorSubject 
      // with the starting data.

       subject = new BehaviorSubject<MyClass>(...instance of class...);
   }

   public void MyClassHasChanged(MyClass class)
   {
      //update database then...
      subject.OnNext(class);
   }
}

А если эти данные есть в списке... то DynamicData тут бы серьезно блистал.

person Lee McPherson    schedule 12.09.2019