Winform ComboBox 绑定

1. 需求

我有一个参数类(AxisPrm),需要与界面的ComboBox进行绑定,ComboBox下拉选项框有两个选项,分别是“是”和“否”,当下拉选择“是”的时候给AxisPrm.IsEnable赋值true,反之,赋值为false

public class AxisPrm
{
    //是否使能
    public bool IsEnable { get; set; }
}

2. 解决方案

2.1 不进行绑定

如果不是有绑定的思想,我想最直接的方式如下所示,但是当外部程序对Prm.IsEnable进行改变的时候,需要重新刷新ComboBox的值,如果外部程序没有手动刷新,值无法传递给界面,那么很可能造成误判:

comboBox1.items.Add("是");
comboBox1.items.Add("否");
if(Prm.IsEnable)//如果值在外部发生改变,需要重新刷新
{
    comboBox1.SelectedIndex = 0;
}
else
{
    comboBox1.SelectedIndex = 1;
}
comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged);

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    switch(comboBox1.SelectedItem)
    {
        case "是":
            Prm.IsEnable = true;
            break;
        case "否":
            Prm.IsEnable = false;
            break;
    }
}

2.2 进行绑定

2.2.1 建立一个ComboBoxDataSource绑定对象

创建一个表,具有两行两列的特性,第一列是String类型,第二列是bool类型。就如键值对一般,选择具体的String值,就有想对应的bool值与之对应。这里之所以不直接用Dictionary类是因为DataSource不支持复杂类型(以后可能支持)。

DataTable dt = new DataTable();
dt.Columns.Add("String", typeof(string));
dt.Columns.Add("Value", typeof(double));
dt.Rows.Add("是", true);
dt.Rows.Add("否", false);
comboBox1.DataSource = dt;
2.2.2 ComboBox显示与值绑定

这里的工作只是与ComboBox有关,DisplayMember意思是ComboBox的界面显示,采用DataSourcedt“String”列的值,所以下拉列表会自动把dt“String”列所有字符自动添加。
ValueMember属性是指定,当选择具体的“String”列里的值,会选择“Value”列的值与之对应。

comboBox1.DisplayMember = "String";
comboBox1.ValueMember = "Value";
2.2.3 ComboBoxAxisPrm.IsEnable进行绑定

当用户对ComboBox的某个下拉选项进行选中时,将会把ComboBoxSelectedValue属性值,即dt里面的Value赋值给AxisPrm.IsEnable

comboBox1.DataBindings.Add("SelectedValue", Prm, "IsEnable", false, DataSourceUpdateMode.OnPropertyChanged);
2.2.4 AxisPrm实现INotifyPropertyChanged接口

当外部程序对AxisPrm.IsEnable进行修改的时候,将同步到界面ComboBox

//AxisPrm 完整版
public class AxisPrm: NotifyBase
{
    public bool m_IsEnable;
    //是否使能
    public bool IsEnable {
        get
        {
            return m_IsEnable;
        }
        set
        {
            m_IsEnable = value;
            NotifyPropertyChanged(() => IsEnable);
        }
    }
}
public class NotifyBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public void NotifyPropertyChanged<T>(Expression<Func<T>> property)
    {
        if (PropertyChanged == null)
            return;
        var memberExpression = property.Body as MemberExpression;
        if (memberExpression == null)
            return;
        PropertyChanged.Invoke(this, new PropertyChangedEventArgs(memberExpression.Member.Name));
    }
}

3. 总结

ComboBox内容少的时候可以不用绑定,但是外部程序对值进行修改的时候,不能忘记对ComboBox进行刷新。不绑定的方式,代码量较少。绑定的方式代码量较多,值更新采用自动化管理,但是在DataBindings阶段,需要把绑定的ComboBox属性名称完全写正确,否则将失败。

源代码参考:
蓝奏云

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值