65.9K
CodeProject 正在变化。 阅读更多。
Home

基于公共类属性的应用程序设置

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.86/5 (10投票s)

2003年8月16日

CPOL

3分钟阅读

viewsIcon

73184

downloadIcon

2501

基于公共类属性的应用设置,动态填充到UI中

Sample Image - PropertyConverter.gif

引言

您如何管理应用程序设置?您如何将它们优雅地显示给用户?如果您想编写可重用的代码来管理和可视化应用程序设置,基本上您需要

  • 动态反射您的设置对象
  • 实现控件来可视化不同的数据类型。
  • 动态创建控件并排列它们
  • 将您的动态控件绑定到设置对象实例。
  • 处理验证和结果验证错误

该代码使用了发布模式程序集中提供的以下UI控件

主要特点

  • 工作方式有点像Visual Studio中著名的PropertyGrid。
  • 您可以实现接口来使用您当前的UI。
    演示应用程序提供了一个类似Visual Studio的选项对话框。
  • 提供公共属性的任何类类型都可以被可视化
  • FlowManager 安排控件
  • 属性和控件之间的数据绑定自动设置
  • 您可以验证数据并设置验证错误消息。
  • 支持本地化(特定于文化的资源)

PropertyConverter

PropertyConverter 反射给定设置对象的公共读写属性。每个设置项基于

术语 description
CategoryAttribute 分类
DescriptionAttribute Label
属性 要可视化的公共读写属性。
string PropertyNameValidating(PropertyType newValue) 验证新值,返回String.Empty表示OK,否则返回一个验证错误消息以取消验证过程。

PropertyConverter 可以根据您的设置类,使用IPropertyConverterControls 填充IPropertyConverterGui 。每个属性都可以有自己的验证方法。您可以通过IPropertyConverterGui 将验证消息发送到错误提供程序。FlowManager 负责布局。如果设置类有嵌入的资源文件(resx),则类别和描述将被本地化。

IPropertyConverterGui 接口

我们首先实现IPropertyConverterGui 接口。您可以使用窗体上的TabControl,或者我在演示应用程序中使用的PropertyTree
IPropertyConverterControl CreateControl(
PropertyInfo propertyInfo
); 

请求为给定的PropertyInfo 类型创建IPropertyConverterControl (控件),例如,对于string 类型,您将创建一个实现IPropertyConverterControl 的文本框控件并返回它。在Raccoom.Windows.Forms.PropertyConverterControls 命名空间中提供了一些控件。

Control CreateGroup(
string group
);

请求新的选项组。例如,您创建一个新的TabPage 并返回它。

void SetError(
IPropertyConverterControl control,
string message
);

验证消息输出,例如,您可以调用ErrorProvider.SetError((Control) control, message)

IPropertyConverterControl 接口

object Value {get; set;}

通过实现此接口到您的控件,您可以使用PropertyConverter 可视化任何数据类型。因为您负责映射属性类型,所以您可以创建任何您喜欢的控件来可视化您的数据类型。您唯一需要做的就是实现这个轻量级的接口。它用于数据绑定。

基本上,您像这样实现此接口

    /// IPropertyConverterControl implementation for TextBox.
    public class TextBoxOption : TextBox, IPropertyConverterControl
    {
        public TextBoxOption() {}
    
        #region IPropertyConverterControl Members

        public object Value
        {
            get
            {
                return base.Text;
            }
            set
            {
                if(value is string) base.Text = (string) value;
            }
        }

        #endregion
    }

如何验证您的数据

对于每个公共属性,您可以编写自己的验证方法。它必须具有以下签名

string PropertyNameValidating(PropertyType newValue)

如果您返回String.Empty,则验证成功。如果您返回验证错误消息,则验证被取消。

public string UserNameValidating(string newValue)
{
    if(newValue=="OK") return String.Empty;
    return "Value is not OK, please change!";
}

如何本地化您的类别和描述

您可以为每种文化提供资源文件(resx)。资源键必须是类别/描述的名称。PropertyConverter 会自动加载资源文件并本地化字符串。

演示应用程序

演示应用程序中的设置类在启动时被反序列化,您可以更改设置,完成后可以接受(序列化)或拒绝您的更改。如果您输入了无效数据,错误提供程序会告知您问题。

结论

  • FlowManager 仅垂直排列控件,不关心clientrectangle的最小/最大尺寸。

链接

历史

  • 2003年8月16日 实验性发布

祝您使用愉快。

© . All rights reserved.