问题描述
ReactiveCommand
.CreateFromTask(_ => GetPerson())
.Execute()
.Subscribe(x => person = x);
var canNext = person?.Friends
.ToObservableChangeSet()
.AutoRefresh(x => x.Selected)
.ToCollection()
.Select(x => x.Any(y => y.Selected));
MyCommand = ReactiveCommand.CreateFromTask(async _ => Debug.Write("Hello"),canNext);
如何让 canNext
更新以禁用/启用我的命令?
如果我使用 person
对 friends
进行硬编码,则 canNext
在选择和取消选择朋友时可以正常工作。但是,当将 person
分配给 async
调用 GetPerson()
时,它会中断运行到 canNext
的任何更新。
我创建了一个虚拟项目来帮助演示该问题。 https://github.com/grierson/updateButton
解决方法
如何解决?
要获得您想要的行为,您可以先初始化 person
,然后当您调用 GetPerson()
时,只需更新您已有的 person
,如下
person = new Person() { Friends = new ObservableCollection<Friend>() };
ReactiveCommand
.CreateFromTask(_ => GetPerson())
.Execute()
.Subscribe(x =>
{
foreach (var friend in x.Friends)
{
person.Friends.Add(friend);
}
});
var canNext = person?.Friends
.ToObservableChangeSet()
.AutoRefresh(x => x.Selected)
.ToCollection()
.Select(x => x.Any(y => y.Selected));
MyCommand = ReactiveCommand.CreateFromTask(async _ => Debug.Write("Hello"),canNext);
现在谈谈你做错了什么:
为什么按钮没有变化?
这种行为的原因是当你运行时
ReactiveCommand
.CreateFromTask(_ => GetPerson())
.Execute()
.Subscribe(x => person = x);
var canNext = person?.Friends
.ToObservableChangeSet()
.AutoRefresh(x => x.Selected)
.ToCollection()
.Select(x => x.Any(y => y.Selected));
MyCommand = ReactiveCommand.CreateFromTask(async _ => Debug.Write("Hello"),canNext);
当您到达设置 MyCommand
的那一行时,canNext
的值是 null
:发生这种情况是因为 person
在那个点是 null
时间,因此您将一个 null
值传递给 canExecute
的 CreateFromTask
参数,即您实际上是在设置
MyCommand = ReactiveCommand.CreateFromTask(async _ => Debug.Write("Hello"),null);
或者什么是一样的
MyCommand = ReactiveCommand.CreateFromTask(async _ => Debug.Write("Hello"));
也就是说,您并没有真正向 canExecute
传递任何信息,而 Button
只是始终处于活动状态,正如您在运行上面的代码时所看到的那样。
P.S.:感谢提供简单的示例。关键在于能否找出问题的根源。