2010-11-06 41 views
0

J'essaie de créer un PropertyGrid basé sur WPF.WPF PropertyGrid Problème

Récemment, j'ai essayé le projet wpg.codeplex.com, mais j'ai eu quelques problèmes avec ce contrôle. Maintenant, j'essaie de développer http://blog.joachim.at/?p=36 ce projet.

J'ai ajouté avec succès des valeurs Enum, le soutien, mais j'ai des problèmes avec les collections.

Par exemple, mon objet personnalisé a une propriété dont le nom est City et le type est Guid. Je veux, les utilisateurs peuvent sélectionner la ville de combobox.

Je me battais avec TypeConverts, IValueConverts et etc ..

Comment puis-je résoudre ce problème?

+0

Les utilisateurs intéressés peuvent également vérifier la solution que j'avais mis en œuvre - http://stackoverflow.com/questions/2816555/wpf-propertygrid-adding-support-for-collections – akjoshi

Répondre

1

Après des heures de travail j'ai résolu mon problème. Je n'avais besoin que de TypeConverter pour résoudre ce problème, j'ai donc créé une classe dérivée de 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); 
      } 
     } 

aide TypeConverter personnalisé

class MyClass 
{ 

// my some props.. 

// my some props.. 

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

// my some methods.. 
} 
+0

+1 Bahadir, c'est une approche cool, pouvez-vous poster le code de votre grille de propriété, comment avez-vous utilisé ce convertisseur de type? – akjoshi

+0

@akjoshi, j'ai ajouté en utilisant TypeConverter –