Wpf PropertyGrid Min/Max attrs

c#, propertygrid, wpf, wpf-extended-toolkit

Solution

You can achieve this by extending `PropertyGrid` code.

Following code working with integer properties.

Step by step:

1) Download source Extended WPF Toolkit from https://wpftoolkit.codeplex.com/SourceControl/latest.

2) Add `Xceed.Wpf.Toolkit` project to your solution.

3) Add `RangeAttribute` class in the following namespace:

namespace Xceed.Wpf.Toolkit.PropertyGrid.Implementation.Attributes
{
    [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
    public class RangeAttribute : Attribute
    {
        public RangeAttribute(int min, int max)
        {
            Min = min;
            Max = max;
        }

        public int Min { get; private set; }
        public int Max { get; private set; }
    }
}

4) Edit code in class `ObjectContainerHelperBase` to assign Min and Max values to appriopriate editor (`IntegerUpDown`). I posted entire method `GenerateChildrenEditorElement`, just replace this method with following code:

private FrameworkElement GenerateChildrenEditorElement( PropertyItem propertyItem )
{
  FrameworkElement editorElement = null;
  DescriptorPropertyDefinitionBase pd = propertyItem.DescriptorDefinition;
  object definitionKey = null;
  Type definitionKeyAsType = definitionKey as Type;

  ITypeEditor editor = pd.CreateAttributeEditor();
  if( editor != null )
    editorElement = editor.ResolveEditor( propertyItem );


  if( editorElement == null && definitionKey == null )
    editorElement = this.GenerateCustomEditingElement( propertyItem.PropertyDescriptor.Name, propertyItem );

  if( editorElement == null && definitionKeyAsType == null )
    editorElement = this.GenerateCustomEditingElement( propertyItem.PropertyType, propertyItem );

  if( editorElement == null )
  {
    if( pd.IsReadOnly )
      editor = new TextBlockEditor();

    // Fallback: Use a default type editor.
    if( editor == null )
    {
      editor = ( definitionKeyAsType != null )
      ? PropertyGridUtilities.CreateDefaultEditor( definitionKeyAsType, null )
      : pd.CreateDefaultEditor();         
    }

    Debug.Assert( editor != null );

    editorElement = editor.ResolveEditor( propertyItem );

      if(editorElement is IntegerUpDown)
      {
          var rangeAttribute = PropertyGridUtilities.GetAttribute<RangeAttribute>(propertyItem.DescriptorDefinition.PropertyDescriptor);
          if (rangeAttribute != null)
          {
              IntegerUpDown integerEditor = editorElement as IntegerUpDown;
              integerEditor.Minimum = rangeAttribute.Min;
              integerEditor.Maximum = rangeAttribute.Max;
          }
      }
  }

  return editorElement;
}

Problem

I am using PropertyGrid from WPF Extended toolkit for a lot types of objects. Objects are wrapps for configs. Many properties are integers and I want to define minimum/maximum range of concrete property in the class definition. Something like this: ``` [Category("Basic")] [Range(1, 10)] [DisplayName("Number of outputs")] public int NumberOfOutputs { get { return _numberOfOutputs; } set { _numberOfOutputs = value; } } ``` Is there some solution to achive that? I think it is possible with PropertyGrid custom editor, but I mean it is unnecessarily complicated. Thank you very much!

Original source