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

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (11投票s)

2009年10月16日

CPOL

2分钟阅读

viewsIcon

25016

downloadIcon

240

本文介绍了一种简单的解决方案, 可根据一个条件在运行时操作多个 UI 元素

引言

我喜欢设计方便的用户界面。通常它包含菜单和工具栏,它们提供了许多好处。但最终我发现,如果我想检查/取消检查或启用/禁用一些按钮或菜单元素(例如:如果我们未连接到数据库,则禁用按钮和从数据库中选择数据的相应菜单项),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 属性。

下一步。 声明一个类型为 EnabledBindingPropertyprivate 变量,并将类似这样的代码添加到应用程序主窗体的构造函数中

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日 - 初始发布
© . All rights reserved.