public void SetState(object newState) { if (State == newState) { return; } if (newState == null) { // delete all children return; } Debug.WriteLine("SetState"); var properties = new ObjectDescriptor().GetProperties(newState); Debug.WriteLine("Properties: " + string.Join(", ", properties.Select(p => p.Name))); foreach (var property in properties) { var value = property.GetValue(newState); object oldValue; var exists = Children.TryGetValue(property.Name, out oldValue); bool changed = false; SetChild(oldValue, ref value, out changed); if (exists) { Children[property.Name] = value; } else { Children.Add(property.Name, value); } if (changed) { RaisePropertyChanged(property.Name); } } State = newState; }