我是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
但没有打印出来:(
答案 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。