2016-03-14 4 views
0

Я новичок в ReactiveUI, и я пытаюсь создать простой реактивный объект с реактивными свойствами. Я не получаю уведомление, когда свойство установлено. Это мой код:Простое свойство объекта ReactiveUI не срабатывает

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using ReactiveUI; 
using System.Windows.Media.Media3D; 

namespace SUReactiveUITest 
{ 
    public class MyRepository : ReactiveObject 
    { 
     Point3D _SyncPoint; 
     public Point3D SyncPoint 
     { 
      get { return _SyncPoint; } 
      set 
      { 
       _SyncPoint = value; 
       this.RaiseAndSetIfChanged(ref _SyncPoint, value); 
      } 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Program program = new Program(); 
     } 

     MyRepository repo = new MyRepository(); 
     Program() 
     { 
      repo.WhenAnyValue(x => x.SyncPoint).Subscribe(OnNewSyncPoint); 
      repo.SyncPoint = new Point3D(1, 2, 3); 
      repo.SyncPoint = new Point3D(10, 20, 30); 
     } 

     void OnNewSyncPoint(Point3D p) 
     { 
      System.Console.WriteLine("My point NEW value: {0}", p); 
     } 
    } 
} 

Я ожидал, что OnNewSyncPoint() будет называться, и вывод должен быть:
          Моя точка Новое значение: 1,2,3
          Моя точка Новое значение: 10,20,30
Но ничего не печатается :(

+1

избавиться от _SyncPoint = значение; который устанавливает значение до того, как RaiseAndSetIfChanged выполнит реальную работу и, таким образом, не изменится или не изменит наблюдаемое значение. – kenny

ответ

1

Ke nny заслуживает реального кредита. Он прав, что RaiseAndSetIfChanged будет устанавливать значение напрямую, так что вам не нужно значение _SyncPoint =;

1

Спасибо @kenny за ответ. Вот документация к нему:
От ReactiveUI documentation:

Read-Write Properties

Свойства, которые участвуют в уведомления об изменении (то есть тот сигнал, когда они меняются), записываются следующим образом:

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

Обратите внимание, что в отличие от других фреймов, они всегда записываются таким образом, используя тот же самый шаблонный код. Если вы пытаетесь поместить что-либо в сеттер, вы почти наверняка будете делать это неправильно, вместо этого вместо этого следует использовать WhenAny и ToProperty.

Смежные вопросы