运行时操作多个控件的一种简单方法






4.75/5 (11投票s)
本文介绍了一种简单的解决方案,
引言
我喜欢设计方便的用户界面。通常它包含菜单和工具栏,它们提供了许多好处。但最终我发现,如果我想检查/取消检查或启用/禁用一些按钮或菜单元素(例如:如果我们未连接到数据库,则禁用按钮和从数据库中选择数据的相应菜单项),Visual Studio 的 ToolStripItem
控件并没有给我太多空间来这样做。基本上,这就是 PropertyBinding
的作用,但 ToolStripItem
却没有。
所以,问题是:我们需要一种简单的方法,通过仅更新一个条件来更改多个 UI 元素的属性。
解决方案
那么,让我们看看,我们需要什么来解决前面提出的问题? 基本上,这是一个包含以下内容的类
- 条件值
- 要操作的控件集合
- 事件,将在值更改时触发
让我们从最后一个陈述开始
public delegate void PropertyChangedHandler();
public class PropertyChangedEvent
{
protected event PropertyChangedHandler handler;
protected virtual void OnPropertyChanged()
{
if (handler != null)
handler();
}
}
正如它一样简单,代码提供了我们所需要的一切。 考虑到代码必须尽可能可重用,我决定将此事件分开,并从中派生一个 abstract
泛型类。 这个 abstract
类将包含我们在这里需要的所有基本功能。
public abstract class BindingProperty<t>: PropertyChangedEvent
{
protected T defaultValue;
protected T value;
public T Value
{
get { return this.value; }
set { this.value = value; base.OnPropertyChanged(); }
}
protected List<k> controls = new List<k>();
public List<k> Controls
{
get { return controls; }
}
public void SetDefault()
{
Value = defaultValue;
}
public abstract void eventHandler();
}
简短说明
T
是条件值的类型。 在本文中,我将使用bool
作为示例。K
是此类实现将与之配合使用的控件的类型。 我将使用ToolStripItem
。defaultValue
是在初始化期间应设置的值。Value
是将从应用程序中使用的主要属性。 更改它后,父类的事件将触发。Controls
是控件类型的List
。- 调用
SetDefault
将把条件值重置为其默认值。 - 最后,通过实现
eventHandler
,我们将完成工作。 我决定将其设为abstract
,因此开发人员将必须实现它,并且不会忘记任何事情。
Using the Code
首先,必须实现我们的泛型 abstract
类。 它应该看起来像这样(当然,取决于您的任务)
public class EnabledBindingProperty: BindingProperty
{
public EnabledBindingProperty(bool AValue)
{
value = AValue;
this.defaultValue = AValue;
base.handler += new PropertyChangedHandler(eventHandler);
}
public override void eventHandler()
{
foreach (ToolStripItem c in controls)
c.Enabled = value;
}
}
任何对控件的篡改都必须放置在 eventHandler
主体中。 在此示例中,我更改了 Enabled
属性。
下一步。 声明一个类型为 EnabledBindingProperty
的 private
变量,并将类似这样的代码添加到应用程序主窗体的构造函数中
private EnabledBindingProperty enabledProp = new EnabledBindingProperty(true);
public MainForm()
{
InitializeComponent();
//adding controls to enabledProp
enabledProp.Controls.Add(toolStripButton1);
enabledProp.Controls.Add(toolStripButton2);
enabledProp.Controls.Add(toolStripSplitButton1);
enabledProp.Controls.Add(subitem1ToolStripMenuItem);
enabledProp.Controls.Add(subitem2ToolStripMenuItem);
enabledProp.SetDefault();
}
所以,实际上就是这样。 剩下的最后一件事是将条件切换器放在某个地方。 像这样
private void Button1Click(object sender, EventArgs e)
{
enabledProp.Value = true;
}
关注点
当然,这些只是微不足道的例子。 如果你觉得这有用(这是我第一次尝试在 CodeProject 上写文章),请让我知道。
历史
- 2009年10月16日 - 初始发布