/// <summary>
        /// The create field.
        /// </summary>
        /// <param name="propertyInfo">
        /// The property.
        /// </param>
        /// <param name="parentField">
        /// The parent field.
        /// </param>
        /// <returns>
        /// The <see cref="ISingleItemViewDisplayListDisplayFieldViewModel"/>.
        /// </returns>
        /// <exception cref="ArgumentNullException">
        /// The <paramref name="propertyInfo"/> parameter is null.
        /// </exception>
        /// <exception cref="ArgumentNullException">
        /// The <paramref name="parentField"/> parameter is null.
        /// </exception>
        public ISingleItemViewDisplayListDisplayFieldViewModel CreateField(PropertyInfo propertyInfo, ISingleItemViewDisplayListFieldViewModel parentField)
        {
            if (propertyInfo == null)
                throw new ArgumentNullException("propertyInfo");

            if (parentField == null)
                throw new ArgumentNullException("parentField");

            var displayField = new SingleItemViewDisplayListDisplayFieldViewModel(parentField)
                                   {
                                       ViewTemplate = FieldTemplateCreator.CreateTemplate(propertyInfo)
                                   };

            var displayAttribute = propertyInfo.GetCustomAttribute<DisplayAttribute>();
            if (displayAttribute != null)
            {
                displayField.Header = displayAttribute.GetName();
                displayField.Order = displayAttribute.GetOrder() ?? int.MaxValue;
            }

            var displayFieldAttribute = propertyInfo.GetCustomAttribute<ReferenceDisplayFieldAttribute>();
            if (displayFieldAttribute != null)
            {
                displayField.IsFieldNameHidden = displayFieldAttribute.IsFieldNameHidden;
                displayField.WidthPercentage = displayFieldAttribute.WidthPercentage / 100.0;
            }

            return displayField;
        }
        public void PropertiesTest()
        {
            // Arrange.
            var parentField = Mock.Create<ISingleItemViewDisplayListFieldViewModel>(Behavior.Loose);
            var field = new SingleItemViewDisplayListDisplayFieldViewModel(parentField);

            // Act / Assert.
            Assert.AreSame(parentField, field.ParentField);
            Assert.AreEqual(1.0, field.WidthPercentage);
            TestsHelper.TestPublicPropertiesGetSet(field, f => f.WidthPercentage);

            field.WidthPercentage = 0.5;
            Assert.AreEqual(0.5, field.WidthPercentage);
            TestsHelper.VerifyThrow<ArgumentOutOfRangeException>(() => field.WidthPercentage = -0.5);
            TestsHelper.VerifyThrow<ArgumentOutOfRangeException>(() => field.WidthPercentage = 1.5);
        }
        public void NotifyPropertyChangedTest()
        {
            // Arrange.
            var parentField = Mock.Create<ISingleItemViewDisplayListFieldViewModel>(Behavior.Loose);
            var field = new SingleItemViewDisplayListDisplayFieldViewModel(parentField);

            // Act / Assert.
            TestsHelper.TestPropertyWithNotifyPropertyChanged(field, () => field.IsFieldNameHidden);
            TestsHelper.TestPropertyWithNotifyPropertyChanged(field, () => field.ViewTemplate);
            TestsHelper.TestPropertyWithNotifyPropertyChanged(field, () => field.Header);
            TestsHelper.TestPropertyWithNotifyPropertyChanged(field, () => field.Order);

            var hasNotified = false;

            field.PropertyChanged +=
                (sender, e) => hasNotified = hasNotified || e.PropertyName == TestsHelper.ExtractPropertyName(() => field.WidthPercentage);
            
            field.WidthPercentage = 0.5;
        }