public void DynamicList() { var conditions = new ObservableCollection <ICondition>(); using (var condition = new OrCondition(conditions, leaveOpen: true)) { var actuals = new List <bool?>(); using (condition.ObserveIsSatisfiedChanged() .Subscribe(c => actuals.Add(c.IsSatisfied))) { var preRequisiteChanges = 0; using (condition.ObservePropertyChangedSlim(x => x.Prerequisites, signalInitial: false) .Subscribe(x => preRequisiteChanges++)) { Assert.AreEqual(0, preRequisiteChanges); CollectionAssert.IsEmpty(condition.Prerequisites); Assert.AreSame(condition.Prerequisites, condition.Prerequisites); Assert.AreEqual(null, condition.IsSatisfied); CollectionAssert.IsEmpty(actuals); Assert.AreEqual(null, condition.IsSatisfied); conditions.Add(Mock.Of <ICondition>(x => x.IsSatisfied == true)); Assert.AreEqual(true, condition.IsSatisfied); CollectionAssert.AreEqual(new[] { true }, actuals); Assert.AreEqual(1, preRequisiteChanges); CollectionAssert.AreEqual(conditions, condition.Prerequisites); Assert.AreSame(condition.Prerequisites, condition.Prerequisites); Mock.Get(conditions[0]).SetupGet(x => x.IsSatisfied).Returns(false); Mock.Get(conditions[0]).Raise(x => x.PropertyChanged += null, new PropertyChangedEventArgs("IsSatisfied")); Assert.AreEqual(false, condition.IsSatisfied); CollectionAssert.AreEqual(new[] { true, false }, actuals); Assert.AreEqual(1, preRequisiteChanges); CollectionAssert.AreEqual(conditions, condition.Prerequisites); Assert.AreSame(condition.Prerequisites, condition.Prerequisites); } } } }