public void DataContainerBase_SetBinding_MustBindOneWay()
        {
            const string PROP_NAME = "IntProperty";
            const int    VALUE     = 42;
            const int    NEW_VALUE = 14;

            IPropertyContainer pc = PropertyContainerBuilder.Create()
                                    .Property(PROP_NAME, VALUE)
                                    .Build();

            var bindingTarget = new BindingTestObject();

            Assert.NotEqual(VALUE, bindingTarget.IntProperty);

            pc.SetBinding(PROP_NAME, () => bindingTarget.IntProperty, BindingMode.OneWay);

            Assert.Equal(VALUE, bindingTarget.IntProperty);

            pc.SetValue(PROP_NAME, NEW_VALUE);

            Assert.Equal(NEW_VALUE, bindingTarget.IntProperty);

            bindingTarget.IntProperty = 32;

            int propertyValue = 0;

            pc.GetValue(PROP_NAME, ref propertyValue);

            pc.RemoveBinding(PROP_NAME, () => bindingTarget.IntProperty);

            Assert.NotEqual(32, propertyValue);
            Assert.Equal(NEW_VALUE, propertyValue);
        }
        /// <summary>
        /// Gets list items for property that implemented as <see cref="IPropertyContainer"/> list.
        /// Example:
        /// <code>
        /// - Source: IPropertyContainer
        ///   - ListProperty: IPropertyContainer
        ///     - ListItem: IPropertyContainer
        ///     - ListItem: IPropertyContainer
        /// </code>
        /// </summary>
        /// <param name="propertyContainer">Source property container.</param>
        /// <param name="listProperty">List property.</param>
        /// <returns>ListItem enumeration.</returns>
        public static IEnumerable <IPropertyContainer> GetListItems(
            this IPropertyContainer propertyContainer,
            IProperty <IPropertyContainer> listProperty)
        {
            IPropertyContainer list = propertyContainer.GetValue(listProperty) ?? PropertyContainer.Empty;

            return(list
                   .Select(pv => pv.ValueUntyped as IPropertyContainer)
                   .Where(container => container != null) !);
        }
        /// <summary>
        /// Merges composite properties to one container.
        /// </summary>
        /// <param name="propertyContainer">Source property container.</param>
        /// <param name="mergeMode">Merge mode. Default: <see cref="PropertyAddMode.Set"/>.</param>
        /// <param name="properties">Properties to merge.</param>
        /// <returns>New <see cref="IPropertyContainer"/> instance.</returns>
        public static IPropertyContainer MergeProperties(
            this IPropertyContainer propertyContainer,
            PropertyAddMode mergeMode = PropertyAddMode.Set,
            params IProperty <IPropertyContainer>[]?properties)
        {
            propertyContainer.AssertArgumentNotNull(nameof(propertyContainer));

            return(properties
                   .NotNull()
                   .Select(property => propertyContainer.GetValue(property))
                   .Merge(mergeMode));
        }
 /// <inheritdoc />
 public Entity ToModel(IPropertyContainer container)
 {
     return(new Entity(
                createdAt: container.GetValue(CreatedAt),
                name: container.GetValue(Name)));
 }
 /// <inheritdoc />
 public T GetValue <T>(IProperty <T> property, bool searchInParent = true) => _propertyContainer.GetValue(property, searchInParent);