4

我正在使用 WPF 扩展工具包中的 PropertyGrid 来处理很多类型的对象。对象是配置的包装。许多属性都是整数,我想在类定义中定义具体属性的最小/最大范围。

像这样的东西:

    [Category("Basic")]
    [Range(1, 10)]
    [DisplayName("Number of outputs")]
    public int NumberOfOutputs
    {
        get { return _numberOfOutputs; }
        set 
        {
            _numberOfOutputs = value;
        }
    }

有什么解决方案可以实现吗?我认为使用 PropertyGrid 自定义编辑器是可能的,但我的意思是它不必要地复杂。

非常感谢!

4

2 回答 2

4

PropertyGrid您可以通过扩展代码来实现这一点。

以下代码使用整数属性。

一步步:

1) 从https://wpftoolkit.codeplex.com/SourceControl/latest下载源扩展 WPF 工具包。

2)将Xceed.Wpf.Toolkit项目添加到您的解决方案中。

3)RangeAttribute在以下命名空间中添加类:

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) 在类中编辑代码ObjectContainerHelperBase以将 Min 和 Max 值分配给适当的编辑器 ( IntegerUpDown)。我发布了整个方法GenerateChildrenEditorElement,只需将此方法替换为以下代码:

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;
}
于 2014-02-23T18:33:56.720 回答
0

刚刚发现自己需要类似的东西来设置可见性值(应该只允许从 0.0 到 1.0的双精度类型)。

但是我采用了不同的解决方案,所以在这里它可以帮助某人:

[Category("Visibility")]
[DisplayName("Visibility value")]
[ItemsSource(typeof(MyVisibilityItemsSource))]
public double MyVisibility { get; set; }
public class MyVisibilityItemsSource: IItemsSource
{
    public ItemCollection GetValues()
    {
        ItemCollection visibilities = new ItemCollection
        {
            0.0,
            0.1,
            0.2,
            0.3,
            0.4,
            0.5,
            0.6,
            0.7,
            0.8,
            0.9,
            1.0
        };
        return visibilities;
    }
}

这将显示一个带有来自上面 ItemCollection 的数字的 ComboBox。当范围内有很多数字时,这并不理想,但是对于像这样简单的事情,它可以完成工作。

于 2020-11-06T14:06:31.897 回答