简单的ReactiveUI对象属性不会触发

时间:2016-03-14 16:36:02

标签: 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
但没有打印出来:(

2 个答案:

答案 0 :(得分:1)

肯尼应得到真正的信任。他是正确的,RaiseAndSetIfChanged将直接设置值,因此您不需要_SyncPoint =值;

答案 1 :(得分:1)

感谢@kenny的回答。这是它的文档:
来自ReactiveUI documentation

读写属性

参与变更通知的属性(即变更时的信号)按以下​​方式编写:

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

请注意,与其他框架不同,它们始终以这种方式编写,使用完全相同的样板代码。如果你试图在setter中放置任何东西,你几乎肯定是在做错了,而应该使用WhenAny和ToProperty。