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






3.86/5 (10投票s)
基于公共类属性的应用设置,动态填充到UI中
引言
您如何管理应用程序设置?您如何将它们优雅地显示给用户?如果您想编写可重用的代码来管理和可视化应用程序设置,基本上您需要
- 动态反射您的设置对象
- 实现控件来可视化不同的数据类型。
- 动态创建控件并排列它们
- 将您的动态控件绑定到设置对象实例。
- 处理验证和结果验证错误
该代码使用了发布模式程序集中提供的以下UI控件
- 一个可设计的VS.NET属性树 by Russell Morris
- FlowPanel by Gytis Jakutonis
- .NET 颜色选择器控件 By Philip Lee
主要特点
- 工作方式有点像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日 实验性发布
祝您使用愉快。