如何创建类似于checkBox的属性检查?

时间:2014-11-11 05:59:21

标签: c# winforms

IDE:vs 2010,c#.net,winforms

嗨,我正在创建一个切换按钮userControl,它将具有ON和OFF状态,我也创建了一个设置按钮初始状态的属性(SAME为复选框IsChecked)。

public bool Checked
    {
        get { return isToggleOn; }
        set { isToggleOn = value;
        onPropertyChanged();
        }

    }

    private void onPropertyChanged()
    {          

        this.BackgroundImage = isToggleOn ? Properties.Resources.toggleOnMIUI : Properties.Resources.toggleOffMIUI;
        IsChecked = isToggleOn ? true : false;


    }  

这在设计时是有效的,现在在form1中我添加了这个控件并创建了OnClickEvent来检查当前状态:

private void ucTglOverStepping_Click(object sender, EventArgs e)
    {
        if (ucTglOverStepping.Checked)
        {
           doWork = true; //do work is bool variable in form1.cs
        }
        else if (!ucTglOverStepping.Checked)
        {
            doWork = false;
        }
    }  

现在的问题是,当切换按钮处于打开状态时,它将进入其他状态。

因为onPropertyChanged()在此ucTglOverStepping_Click(对象发送者,EventArgs e)函数之前执行,是否有任何方法在执行ucTglOverStepping_Click()函数或任何其他技术来执行onPropertyChanged()以解决此问题。< / p>

问题说明:

测试用例1:假设当前状态为ON

  1. 用户点击了按钮 -​​ &gt;它将进入关闭状态(检查应该变为false,它应该进入OnClickEvent的其他条件。但检查是否成功。)

1 个答案:

答案 0 :(得分:0)

您需要调用属性set;get;中的函数

 public bool Checked
        {
            get
            {
                return isToggleOn;
            }
            set
            {
                onPropertyChanged();
                isToggleOn = value;
            }

        }

如果onPropertyChanged()仅在您设置/更改值或Checked属性时调用..

在你的函数中似乎你在最后一行再次设置属性..所以它调用函数递归..你不需要再次设置IsChecked

private void onPropertyChanged()
{          

    this.BackgroundImage = isToggleOn ? Properties.Resources.toggleOnMIUI : Properties.Resources.toggleOffMIUI;
// not need this 
//    IsChecked = isToggleOn ? true : false;


}  

你的问题是

private void ucTglOverStepping_Click(object sender, EventArgs e)
    {
        if (ucTglOverStepping.Checked)
        {
           doWork = true; //do work is bool variable in form1.cs
        }
        else if (!ucTglOverStepping.Checked)
        {
            doWork = false;
        }
    }  

当你获得属性值时,它只运行第一部分,它不会去调用 `onPropertyChanged()&#39; 它只会运行

    public bool Checked
            {
                get
                {
                    return isToggleOn;
                }
}

更新

它令人困惑......

但为什么不使用CheckBox1_CheckedChanged事件?