2014-02-23 10 views
4

많은 종류의 객체에 대해 WPF Extended 툴킷의 PropertyGrid를 사용하고 있습니다. 오브젝트는 config 용 wrapp입니다. 많은 프로퍼티가 정수이고 클래스 정의에서 최소/최대 범위의 구체적인 속성을 정의하려고합니다. 이 같은Wpf PropertyGrid Min/Max attrs

뭔가 :

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

는 그것을 실현하려 몇 가지 해결책이 있습니까? PropertyGrid 사용자 정의 편집기를 사용하는 것이 가능하다고 생각하지만 불필요하게 복잡합니다.

대단히 감사합니다!

+0

것은 내가 구체적인 속성에 대한 속성을 사용하고자하는 의미 –

+1

"나는 클래스 정의의 구체적인 속성의 최소/최대 범위를 정의하려면"정교하게하십시오 : 난 그냥 다음 코드를 사용하여이 방법을 대체, 전체 방법 GenerateChildrenEditorElement을 게시 이는 속성의 최소/최대 값을 정의합니다. – Frk

답변

4

PropertyGrid 코드를 확장하면됩니다.

다음 코드는 정수 속성으로 작업합니다. 단계별로

단계 :

1) 다운로드 소스는 https://wpftoolkit.codeplex.com/SourceControl/latest에서 WPF 툴킷을 확장.

2) 솔루션에 Xceed.Wpf.Toolkit 프로젝트를 추가하십시오.

3) 다음 네임 스페이스에 RangeAttribute 클래스를 추가 : 최소 및 최대 값을 지정하는 클래스 ObjectContainerHelperBase에서

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) 편집 코드 편집기 (IntegerUpDown을 appriopriate하기).

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; 
} 
+0

고맙습니다 ... – Frk