2010-11-06 60 views
0

我想創建一個基於WPF的PropertyGrid。WPF PropertyGrid問題

最近我嘗試了wpg.codeplex.com項目,但是我對這個控件有些問題。 現在,我正在努力開發http://blog.joachim.at/?p=36這個項目。

我成功地添加了枚舉值,支持但我有收藏問題。

例如,我的自定義對象有一個屬性,名稱是城市,類型是Guid。 我想要的,用戶可以從組合框中選擇城市。

我與戰鬥TypeConverts,IValueConverts,和等。

我怎麼能解決這個問題?

+0

感興趣的用戶還可以檢查解決方案,我已經實現 - http://stackoverflow.com/questions/2816555/wpf-propertygrid-adding-support-for-collections – akjoshi 2011-01-12 09:25:16

回答

1

經過數小時的工作,我解決了我的問題。 我只需要TypeConverter來解決這個問題,所以我創建了一個派生自TypeConverter的類。

class PierListConverter : TypeConverter 
     { 
      ArrayList piers = new ArrayList(); 
      public PierListConverter() 
      { 

      } 
      public override bool 
      GetStandardValuesSupported(ITypeDescriptorContext context) 
      { 
       return true; 
      } 
      public override StandardValuesCollection 
      GetStandardValues(ITypeDescriptorContext context) 
      { 
       // This method returns me the list that will use to fill combo at property grid. 
       piers.Clear(); 
       foreach (var item in GullsEyeModel.GetInstance().GetPiers()) 
       { 
        piers.Add(item.Id); 
       } 
       StandardValuesCollection cols = new StandardValuesCollection(piers); 
       return cols; 
      } 
      public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
      { 
       // If this method returns true, ConvertFrom method will invoke 
       if (sourceType == typeof(string)) 
       { 
        return true; 
       } 
       else 
       return base.CanConvertFrom(context, sourceType); 
      } 
      public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) 
      { 
       // In this method i am getting selected text and querying; after that i retrieve proparete Guid value and then returning back to my object that binded property grid. 
       if (value != null) 
       { 
        if (value.ToString() == "Seçiniz") 
        { 
         return Guid.Empty; 
        } 
        else if (!string.IsNullOrEmpty(value.ToString())) 
        { 
         GuidConverter g = new GuidConverter(); 
         PierItem[] pierArray = GullsEyeModel.GetInstance().GetPiers(); 
         PierItem selectedPier = pierArray.Where(item => item.Info.Name == value.ToString()).FirstOrDefault(); 
         if (selectedPier != null) 
         { 
          return selectedPier.Id; 
         } 
         else 
          return base.ConvertFrom(context, culture, value); 
        } 
        else 
         return base.ConvertFrom(context, culture, value); 
       } 
       else 
       return base.ConvertFrom(context, culture, value); 
      } 
      public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) 
      { 
// In this method i am converting ID to string (Name) to display in Property Grid 
       if (value != null) 
       { 
        GuidConverter g = new GuidConverter(); 
        PierItem[] piers = GullsEyeModel.GetInstance().GetPiers(); 
        PierItem selectedPier = piers.Where(item => item.Id== (Guid)g.ConvertFromString(value.ToString())).FirstOrDefault(); 
        if (selectedPier != null) 
        { 
         return selectedPier.Info.Name; 
        } 
        else 
         return "Seçiniz"; 
       } 
       else 
       return base.ConvertTo(context, culture, value, destinationType); 
      } 
     } 

使用自定義類型轉換器

class MyClass 
{ 

// my some props.. 

// my some props.. 

[TypeConverter(typeof(PierListConverter))]  
public Guid PierId {get; set;} 

// my some methods.. 
} 
+0

+1 Bahadir,它是一個很酷的方法,你可以發佈你的屬性網格的代碼,你如何使用這種類型的轉換器? – akjoshi 2010-11-10 06:42:56

+0

@akjoshi,我使用TypeConverter添加 – 2010-11-10 07:25:52