使用绑定到复选框的属性订阅嵌套列表中的更改

时间:2015-04-06 20:43:48

标签: c# reactiveui

我试图阻止用户继续,直到他们在列表中选择了至少一个项目。该列表绑定到主视图中的单独视图控件,列表视图模型具有一个bool,其2方式绑定到其视图中的复选框。要继续的命令是主视图模型的一部分,所以尝试听取我正在创建派生列表的更改

tempList = this.WhenAnyValue(x => x.Items,
(layers) => layers == null ? Enumerable.Empty<bool>() : layers.CreateDerivedCollection(x => x.Selected))
.ToProperty(this, x => x.TempList);

CanContinue = this.WhenAnyValue(m => m.CollectionInfo, m => m.TempList,
(collectionDatabase, tempItems) =>
{
    if (collectionDatabase == null || tempItems == null) return false;

    var temp = tempItems.Any(x => x == true);
    return temp;
});

问题是TempList永远不会改变。我可以在子视图模型上看到Selected属性发生了变化,但那就是它。

我也尝试将TempList指定为

tempList = Items.Changed.Select(_ => Items.Select(gr => gr.Selected))
.ToProperty(this, x => x.TempList);

有人有什么建议吗?数据模型不受我的控制,就像在真实应用程序中我从磁盘加载可包含一组或多组数据的数据集一样。如果您想亲自试用,我会得到sample app来证明这个问题。

1 个答案:

答案 0 :(得分:0)

我设法解决了它,重要的一点是在ReactiveList上设置ChangeTrackingEnabled = true然后订阅集合的ItemChanged通知,这意味着不再需要TempList。我还更改了命令的谓词,以使用带有所选项目数的int。

var canContinue = this.WhenAnyValue(x => x.NumSelected, num => num > 0);

this.WhenAnyObservable(x => x.Items.ItemChanged)
    .Subscribe(_ => NumSelected = Items.Count(i => i.Selected));