/// <summary>Get an <see cref="ObservableCollection{T}"/> containing <paramref name="nodes"/>' values.</summary> public override object FromNodes(IEntityProxy parent, IPropertyMapping property, IEntityContext context, IEnumerable <INode> nodes) { var convertedValues = nodes.Select(node => ((ICollectionMapping)property).ElementConverter.Convert(node, context)); var collectionElements = ((IEnumerable <object>)Aggregator.Aggregate(convertedValues)).ToArray(); var genericArguments = (property.ReturnType.IsArray ? new[] { property.ReturnType.GetElementType() } : property.ReturnType.GetTypeInfo().GetGenericArguments()); var observable = (IList)typeof(ObservableCollection <>).MakeGenericType(genericArguments).GetTypeInfo().GetConstructor(Type.EmptyTypes).Invoke(new object[0]); var asEntity = (typeof(IEntity).GetTypeInfo().IsAssignableFrom(genericArguments.Single()) ? AsEntity.MakeGenericMethod(genericArguments) : null); foreach (var item in collectionElements) { observable.Add(asEntity != null ? asEntity.Invoke(null, new[] { item }) : item); } ((INotifyCollectionChanged)observable).CollectionChanged += (sender, args) => DynamicExtensions.InvokeSet((dynamic)parent, property.Name, sender); return(observable); }