WPF PropertyGrid问题

时间:2010-11-06 17:23:20

标签: wpf collections propertygrid typeconverter

我正在尝试创建一个基于WPF的PropertyGrid。

最近我尝试了wpg.codeplex.com项目,但我对这个控件有一些问题。 现在,我正在尝试开发http://blog.joachim.at/?p=36这个项目。

我成功添加了Enum Values,支持但是我遇到了收藏问题。

例如,我的自定义对象具有名称为City且属性为Guid的属性。 我想,用户可以从组合框中选择City。

我正在与TypeConverts,IValueConverts等进行战斗。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分: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);
            }
        }

使用自定义TypeConverter

class MyClass
{

// my some props..

// my some props..

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

// my some methods..
}