Example #1
0
        /// <summary>
        /// Returns the default property for this instance of a component.
        /// </summary>
        /// <returns>
        /// A <see cref="T:System.ComponentModel.PropertyDescriptor"/> that represents the default property for this object, or null if this object does not have properties.
        /// </returns>
        PropertyDescriptor ICustomTypeDescriptor.GetDefaultProperty()
        {
            PropertySpecification propertySpec = this.PropertySpecifications.FirstOrDefault(p => p.Name == this.DefaultProperty);

            return(propertySpec == null ? null : new PropertySpecificationDescriptor(propertySpec, this,
                                                                                     new Attribute[] { new MergablePropertyAttribute(true) }));
        }
        /// <summary>
        /// Returns a collection of standard values for the data type this type converter is designed for when provided with a format context.
        /// </summary>
        /// <param name="context">An <see cref="T:System.ComponentModel.ITypeDescriptorContext"/> that provides a format context that can be used to extract additional information about the environment from which this converter is invoked. This parameter or properties of this parameter can be null.</param>
        /// <returns>
        /// A <see cref="T:System.ComponentModel.TypeConverter.StandardValuesCollection"/> that holds a standard set of valid values, or null if the data type does not support a standard set of values.
        /// </returns>
        public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
        {
            if ((context == null) || (context.PropertyDescriptor == null) || (context.PropertyDescriptor.ComponentType == null) ||
                (context.PropertyDescriptor.ComponentType != typeof(PropertySpecification)))
            {
                return(base.GetStandardValues(context));
            }
            PropertySpecificationDescriptor specificationDescriptor = context.PropertyDescriptor as PropertySpecificationDescriptor;

            if (specificationDescriptor == null)
            {
                // check if the property descriptor is a multi-property descriptor, which is created by various property grids when multiple objects are
                // merged and displayed simultaneously.
                var itemProperty = context.PropertyDescriptor.GetType().GetProperty("Item");
                if (itemProperty == null)
                {
                    return(base.GetStandardValues(context));
                }
                try
                {
                    specificationDescriptor = itemProperty.GetValue(context.PropertyDescriptor, new object[] { 0 }) as PropertySpecificationDescriptor;
                    if (specificationDescriptor == null)
                    {
                        // give up
                        return(base.GetStandardValues(context));
                    }
                }
                catch
                {
                    // no descriptor at index 0
                    return(base.GetStandardValues(context));
                }
            }
            PropertySpecification specification = specificationDescriptor.Specification;

            if ((specification == null) || (specification.ValueList == null) || (specification.ValueList.Count <= 0))
            {
                return(base.GetStandardValues(context));
            }
            return(new StandardValuesCollection(specification.ValueList));
        }
		public void AdvancedPropertyDescriptorConstructionTestWithEvents()
		{
			PropertyBag bag = new PropertyBag();
			// add some property specifications. 
			var property1 = new PropertySpecification("Property 1", typeof(string), "Cat1", "Prop1 desc", "Foo");
			// make readonly
			property1.Attributes.Add(ReadOnlyAttribute.Yes);
			bag.PropertySpecifications.Add(property1);

			// add expanding property
			var property2 = new PropertySpecification("Picture", typeof(Image), "Some Category", "This is a sample description.");
			property2.Attributes.Add(new TypeConverterAttribute(typeof(ExpandableObjectConverter)));
			bag.PropertySpecifications.Add(property2);

			// custom editor
			var property3 = new PropertySpecification("Source folder", typeof(string), "OutputFolders", "The output folder for the sourcecode", "c:\\temp");
			property3.Attributes.Add(new EditorAttribute(typeof(System.Windows.Forms.Design.FolderNameEditor), typeof(System.Drawing.Design.UITypeEditor)));
			bag.PropertySpecifications.Add(property3);

			// use value list
			var property4 = new PropertySpecification("PickAValue", typeof(string), "Cat1", "A property which value has to be picked from a list");
			property4.TypeConverterType = typeof(PropertySpecificationValuesListTypeConverter);
			property4.ValueList.AddRange(new[] { "One", "Two", "Three", "Many" });
			bag.PropertySpecifications.Add(property4);

			// value list to store values in
			Dictionary<string, object> values = new Dictionary<string, object>();

			// event handler binding so values get store inside the dictionary and also retrieved from it. 
			bag.GetValue += (sender, e) => { e.Value = values.GetValue(e.Property.Name); };
			bag.SetValue += (sender, e) => { values[e.Property.Name] = e.Value; };
			
			// open a testform which binds the bag to the propertygrid. Editing values will store the values in the dictionary, default values are
			// not in the dictionary.
			using(TestForm f = new TestForm(bag))
			{
				f.ShowDialog();
			}
		}
 /// <summary>
 /// Initializes a new instance of the <see cref="PropertySpecificationDescriptor"/> class.
 /// </summary>
 /// <param name="specification">The specification.</param>
 /// <param name="containingBag">The containing bag.</param>
 /// <param name="propertyAttributes">The property attributes.</param>
 public PropertySpecificationDescriptor(PropertySpecification specification, PropertyBag containingBag, Attribute[] propertyAttributes)
     : base(specification.Name, propertyAttributes)
 {
     _containingBag = containingBag;
     _specification = specification;
 }
		/// <summary>
		/// Initializes a new instance of the PropertySpecEventArgs class.
		/// </summary>
		/// <param name="property">The PropertySpec that represents the property whose value is being requested or set.</param>
		/// <param name="val">The current value of the property.</param>
		public PropertySpecificationEventArgs(PropertySpecification property, object val)
		{
			ArgumentVerifier.CantBeNull(property, "property");
			this.Property = property;
			this.Value = val;
		}
 /// <summary>
 /// Initializes a new instance of the PropertySpecEventArgs class.
 /// </summary>
 /// <param name="property">The PropertySpec that represents the property whose value is being requested or set.</param>
 /// <param name="val">The current value of the property.</param>
 public PropertySpecificationEventArgs(PropertySpecification property, object val)
 {
     ArgumentVerifier.CantBeNull(property, "property");
     this.Property = property;
     this.Value    = val;
 }
		public void AdvancedPropertyDescriptorConstructionTestWithFuncs()
		{
			PropertyBag bag = new PropertyBag();
			// add some property specifications. 
			var property1 = new PropertySpecification("Property 1", typeof(string), "Cat1", "Prop1 desc", "Foo");
			// make readonly
			property1.Attributes.Add(ReadOnlyAttribute.Yes);
			bag.PropertySpecifications.Add(property1);

			// add expanding property
			var property2 = new PropertySpecification("Picture", typeof(Image), "Some Category", "This is a sample description.");
			property2.Attributes.Add(new TypeConverterAttribute(typeof(ExpandableObjectConverter)));
			bag.PropertySpecifications.Add(property2);

			// custom editor
			var property3 = new PropertySpecification("Source folder", typeof(string), "OutputFolders", "The output folder for the sourcecode", "c:\\temp");
			property3.Attributes.Add(new EditorAttribute(typeof(System.Windows.Forms.Design.FolderNameEditor), typeof(System.Drawing.Design.UITypeEditor)));
			property3.ConvertEmptyStringToNull = true;
			bag.PropertySpecifications.Add(property3);

			// use value list
			var property4 = new PropertySpecification("PickAValue", typeof(string), "Cat1", "A property which value has to be picked from a list", "One");
			property4.TypeConverterType = typeof(PropertySpecificationValuesListTypeConverter);
			property4.ValueList.AddRange(new[] { "One", "Two", "Three", "Many" });
			bag.PropertySpecifications.Add(property4);

			var property5 = new PropertySpecification("EnumValue", typeof(ConsoleColor), "Cat1", "Enum property to see that values are converted back/forth to int");
			bag.PropertySpecifications.Add(property5);

			// value list to store values in
			Dictionary<string, object> values = new Dictionary<string, object>();

			// func setting so values get store inside the dictionary and also retrieved from it. Console write added to see what happens when you bind
			// a windows forms propertygrid to a bag: many many redundant calls to the getters/setters occur.
			bag.ValueGetterFunc = (s) =>
									{
										var v = values.GetValue(s);
										Console.WriteLine("Get: {0} : {1}", s, v ?? "<null>");
										return v;
									};
			bag.ValueSetterFunc = (s, v) =>
									{
										values[s] = v;
										Console.WriteLine("Set: {0} : {1}", s, v ?? "<null>");
									};

			// open a testform which binds the bag to the propertygrid. Editing values will store the values in the dictionary, default values are
			// not in the dictionary.
			using(TestForm f = new TestForm(bag))
			{
				f.ShowDialog();
			}
		}
 /// <summary>
 /// Initializes a new instance of the <see cref="PropertySpecificationDescriptor"/> class.
 /// </summary>
 /// <param name="specification">The specification.</param>
 /// <param name="containingBag">The containing bag.</param>
 /// <param name="propertyAttributes">The property attributes.</param>
 public PropertySpecificationDescriptor(PropertySpecification specification, PropertyBag containingBag, Attribute[] propertyAttributes) :
     base(specification.Name, propertyAttributes)
 {
     _containingBag = containingBag;
     _specification = specification;
 }