WPF中 propertyGrid控件 实现多语言版本问题

liuhaisong290 2013-08-23 05:31:39
propertyGrid 要设置多语言 而且要绑定数据(即在propertyGrid中修改一个字段后台字段的值也修改)
你知道解决方案吗? 求解答
1、首先[CategoryAttribute("标题1"),
DisplayName("标题2"),
Description(""),
DefaultValue(typeof(string), "")
]
public string Name
是不行的,CategoryAttribute要求输入常量,就没办法加入语言控制。
2、网上有些重写这个控件的方法可以实现语言控制,但是用这个方法改变后面的value 后台的值不会改变。实现方法:
http://hi.baidu.com/knowaysoft/item/1f32cbe313267011595dd826

有没有办法实现数据的绑定,我看里面重写了以后有数据的get set,但是没办法把改变传回后台代码。有没有了解的大神。。。。
...全文
592 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
maple_zhj 2014-09-17
  • 打赏
  • 举报
回复
哈哈,我正好路过,楼主问题解决了吧。 在 PropertyDescriptor 重写 Catagory属性,即可达到 目录多语言的 热切换。
liuhaisong290 2013-08-28
  • 打赏
  • 举报
回复
引用 6 楼 qldsrx 的回复:
利用TypeDescriptor.AddProvider方法,添加运行时的TypeDescriptionProvider,下面是对IDictionary<string, object>类型定义的TypeDescriptionProvider,参照这个例子,给你的类型定义自己的TypeDescriptionProvider,添加多语言的CategoryAttribute值。

    public class DynamicDescriptionProvider : TypeDescriptionProvider
    {
        public DynamicDescriptionProvider() : base() { }

        public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object instance)
        {
            return new DynamicTypeDescriptor(objectType, instance);
        }
    }
    public class DynamicTypeDescriptor : CustomTypeDescriptor
    {
        public DynamicTypeDescriptor(Type objectType, object instance)
            : base()
        {
            if (instance != null)
            {
                var tmp = (IDictionary<string, object>)instance;
                var names = tmp.Keys;
                foreach (var name in names)
                {
                    customFields.Add(new DynamicPropertyDescriptor(name, instance));
                }
            }
        }
        List<PropertyDescriptor> customFields = new List<PropertyDescriptor>();
        public override PropertyDescriptorCollection GetProperties()
        {
            return new PropertyDescriptorCollection(customFields.ToArray());
        }

        public override PropertyDescriptorCollection GetProperties(Attribute[] attributes)
        {
            return new PropertyDescriptorCollection(customFields.ToArray());
        }
    }
    public class DynamicPropertyDescriptor : PropertyDescriptor
    {
        Type propertyType = typeof(object);
        public DynamicPropertyDescriptor(string name, object instance)
            : base(name, null)
        {
            var obj = (IDictionary<string, object>)instance;
            if (obj[name] != null)
                propertyType = obj[name].GetType();
        }

        public override bool CanResetValue(object component)
        {
            return false;
        }

        public override Type ComponentType
        {
            get
            {
                return typeof(FastExpando);
            }
        }

        public override object GetValue(object component)
        {
            IDictionary<string, object> obj = (IDictionary<string, object>)component;
            return obj[Name];
        }

        public override bool IsReadOnly
        {
            get
            {
                return false;
            }
        }

        public override Type PropertyType
        {
            get
            {
                return propertyType;
            }
        }

        public override void ResetValue(object component)
        {
            throw new NotImplementedException();
        }

        public override void SetValue(object component, object value)
        {
            IDictionary<string, object> obj = (IDictionary<string, object>)component;
            obj[Name] = value;
        }

        public override bool ShouldSerializeValue(object component)
        {
            return false;
        }
    }
我的问题解决了,参考这个例子 http://www.codeproject.com/Articles/4341/Globalized-Property-Grid-Revisited 可以实现语言的动态切换,但是CategoryName无法改变。查了MSDN文件中的CategoryAttribute.GetLocalizedString Method,说" Category 属性第一次被存取时会呼叫这个方法来查阅指定分类的当地语系化名称。",就是说GetLocalizedString Method只能执行一次。不知道能不能强制改变。 不行的话就加个重启后生效。。。。。
qldsrx 2013-08-26
  • 打赏
  • 举报
回复
利用TypeDescriptor.AddProvider方法,添加运行时的TypeDescriptionProvider,下面是对IDictionary<string, object>类型定义的TypeDescriptionProvider,参照这个例子,给你的类型定义自己的TypeDescriptionProvider,添加多语言的CategoryAttribute值。

    public class DynamicDescriptionProvider : TypeDescriptionProvider
    {
        public DynamicDescriptionProvider() : base() { }

        public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object instance)
        {
            return new DynamicTypeDescriptor(objectType, instance);
        }
    }
    public class DynamicTypeDescriptor : CustomTypeDescriptor
    {
        public DynamicTypeDescriptor(Type objectType, object instance)
            : base()
        {
            if (instance != null)
            {
                var tmp = (IDictionary<string, object>)instance;
                var names = tmp.Keys;
                foreach (var name in names)
                {
                    customFields.Add(new DynamicPropertyDescriptor(name, instance));
                }
            }
        }
        List<PropertyDescriptor> customFields = new List<PropertyDescriptor>();
        public override PropertyDescriptorCollection GetProperties()
        {
            return new PropertyDescriptorCollection(customFields.ToArray());
        }

        public override PropertyDescriptorCollection GetProperties(Attribute[] attributes)
        {
            return new PropertyDescriptorCollection(customFields.ToArray());
        }
    }
    public class DynamicPropertyDescriptor : PropertyDescriptor
    {
        Type propertyType = typeof(object);
        public DynamicPropertyDescriptor(string name, object instance)
            : base(name, null)
        {
            var obj = (IDictionary<string, object>)instance;
            if (obj[name] != null)
                propertyType = obj[name].GetType();
        }

        public override bool CanResetValue(object component)
        {
            return false;
        }

        public override Type ComponentType
        {
            get
            {
                return typeof(FastExpando);
            }
        }

        public override object GetValue(object component)
        {
            IDictionary<string, object> obj = (IDictionary<string, object>)component;
            return obj[Name];
        }

        public override bool IsReadOnly
        {
            get
            {
                return false;
            }
        }

        public override Type PropertyType
        {
            get
            {
                return propertyType;
            }
        }

        public override void ResetValue(object component)
        {
            throw new NotImplementedException();
        }

        public override void SetValue(object component, object value)
        {
            IDictionary<string, object> obj = (IDictionary<string, object>)component;
            obj[Name] = value;
        }

        public override bool ShouldSerializeValue(object component)
        {
            return false;
        }
    }
liuhaisong290 2013-08-26
  • 打赏
  • 举报
回复
引用 3 楼 qldsrx 的回复:
什么叫改变后面的value 后台的值不会改变??? 另外我看那个方法只是在玩,根本不能用在实际项目中,因为这样的处理没有任何实际意义。
本来这个控件是和类里面的属性绑定的,显示属性的值,在界面中更改值会返回到后台代码中 那有什么方法可以实现对标题的语言控制吗?
liuhaisong290 2013-08-24
  • 打赏
  • 举报
回复
引用 1 楼 lhx527099095 的回复:
多语言直接resource里面定义多个语言文件 根据选择语言不同加载不同resource文件不就行了 然后用的地方findresource(“key”)不就行了么?
在别的地方是可以的 但是findresource(“key”)在替换上面的文字的时候会报错,要求是常量。
qldsrx 2013-08-24
  • 打赏
  • 举报
回复
什么叫改变后面的value 后台的值不会改变??? 另外我看那个方法只是在玩,根本不能用在实际项目中,因为这样的处理没有任何实际意义。
lhx527099095 2013-08-23
  • 打赏
  • 举报
回复
多语言直接resource里面定义多个语言文件 根据选择语言不同加载不同resource文件不就行了 然后用的地方findresource(“key”)不就行了么?

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧