2010-10-28 26 views
2

我想使用屬性網格來顯示數據。我必須爲我的預定義字符串常量編寫StringConverters,以便它們可以顯示在組合框中。StringConverter GetStandardValueCollection

考慮顏色列表和角度0,90,180,270的另一個列表。我想在網格上顯示許多這樣的列表。

我正在寫新的類從StringConverters派生並重寫GetStandardValues

class AngleConverter : StringConverter 
{ 
    string[] Units = { "0", "90", "180","270" }; 
    public override bool GetStandardValuesSupported(ITypeDescriptorContext context) 
    { 
     return true; 
    } 
    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) 
    { 
     return new StandardValuesCollection(Units); 
    } 
    public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) 
    { 
     return true; 
    } 
} 

類UnitConverter:......除了字符串數組中的變化相同的代碼。 我在[TypeConverter(typeof(AngleConverter))]]之前使用此類。 如果我想添加一個字符串列表以顯示在網格上的列表框中,我需要創建新的類。

有沒有一種通用的方法來做到這一點,而無需每次創建新的類。

感謝 --Hari

回答

2

編輯:據托馬斯Lycken的這個link答案,它可能會幫助,如果你的屬性是枚舉...

我不知道你是否能避免編寫新課程與否。我不太瞭解你正在做的事情,以瞭解是否有更好或更簡單的方法。說了這麼多,你可以稍微縮短你的類通過使抽象基類是這樣的:

class MyBaseStringConverter : StringConverter 
{ 
    public override bool GetStandardValuesSupported(ITypeDescriptorContext context) 
    { 
     return true; 
    } 
    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) 
    { 
     //Call the abstract GetValues function here. 
     return new StandardValuesCollection(GetValues()); 
    } 
    public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) 
    { 
     return true; 
    } 
    protected abstract string [] GetValues(); 
} 

public AngleConverter : MyBaseStringConverter 
{ 
    protected override string [] GetValues() 
    { 
    return new string [] { "0", "90", "180", "270" }; 
    } 
} 

public ColorConverter : MyBaseStringConverter 
{ 
    protected override string [] GetValues() 
    { 
    return new string [] { "Red", "Green", "Blue" }; 
    } 
} 
2

那麼,我會寫另一個屬性來包含標準值。那麼你的字符串轉換派生類會簡單地從有檢測這個屬性和搶值:

private string _unit = "m/s"; 

[PropertyValueDisplayedAs(new string[] { "m/s", "km/h" })] 
[TypeConverter(typeof(MyStringConverter))] 
public string ConstraintString 
{ 
    get { return _unit; } 
    set { _unit = value; } 
} 

你的轉換器看起來像:

public class MyStringConverter : StringConverter 
{ 
    public override bool GetStandardValuesSupported(ITypeDescriptorContext context) 
    { 
     return true; 
    } 

    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) 
    { 
     PropertyValueDisplayedAsAttribute attr = (PropertyValueDisplayedAsAttribute)context.PropertyDescriptor.Attributes[typeof(PropertyValueDisplayedAsAttribute)]; 
     return new StandardValuesCollection(attr.DisplayedValues); 
    } 
} 

當然,你可以在轉換器緩存的標準值,以避免如果他們不改變每個財產,請求他們。 我會讓你寫PropertyValueDisplayedAsAttribute這是一個非常簡單的屬性持有集合。

相關問題