对 ObservableCollection 的更新做出反应

我有以下一段代码:

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 更新以禁用/启用我的命令?

如果我使用 personfriends 进行硬编码,则 canNext 在选择和取消选择朋友时可以正常工作。但是,当将 person 分配给 async 调用 GetPerson() 时,它会中断运行到 canNext 的任何更新。

我创建了一个虚拟项目来帮助演示该问题。 https://github.com/grierson/updateButton

w75752 回答:对 ObservableCollection 的更新做出反应

如何解决?

要获得您想要的行为,您可以先初始化 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 值传递给 canExecuteCreateFromTask 参数,即您实际上是在设置

MyCommand = ReactiveCommand.CreateFromTask(async _ => Debug.Write("Hello"),null);

或者什么是一样的

MyCommand = ReactiveCommand.CreateFromTask(async _ => Debug.Write("Hello"));

也就是说,您并没有真正向 canExecute 传递任何信息,而 Button 只是始终处于活动状态,正如您在运行上面的代码时所看到的那样。

P.S.:感谢提供简单的示例。关键在于能否找出问题的根源。

本文链接:https://www.f2er.com/1065808.html

大家都在问