【问题标题】:How to create property simmilar to checkBox checked?如何创建类似于 checkBox 选中的属性?
【发布时间】:2014-11-11 05:59:20
【问题描述】:

IDE:vs 2010,c# .net,winforms

嗨,我正在创建一个切换按钮 userControl,它将具有 ON 和 OFF 状态,我还创建了一个属性来设置按钮的初始状态(与复选框 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(object sender, EventArgs e) 函数之前执行的,所以有没有办法在执行 ucTglOverStepping_Click() 函数之后执行 onPropertyChanged() ,或者任何其他技术来解决这个问题。

问题解释:

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

  1. 用户点击按钮 -> 它将进入关闭状态(选中应该变为假,它应该进入 OnClickEvent 的其他条件。但选中变为真。)

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    你需要调用属性的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()' 它只会运行

        public bool Checked
                {
                    get
                    {
                        return isToggleOn;
                    }
    }
    

    更新

    它仍然令人困惑..

    但是你为什么不使用CheckBox1_CheckedChanged Event 呢?

    【讨论】:

    • 遇到同样的问题,添加问题测试用例。
    • 更新回复-> 因为我正在制作切换按钮而不是使用复选框,用于 UI 外观。
    猜你喜欢
    • 2021-10-09
    • 2020-06-17
    • 2015-06-16
    • 2018-10-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多