ComboBox可编辑状态下,当Items更新时Text不清空

场景:实际应用该控件时,遇到了一个问题,当下拉选择一项后,ComboBox.Text即为选择的值,若此时ComboBox所绑定的集合更改,不包含上此选择的项,ComboBox.Text值将会清空,但有这样的场景不需要清空。
解决方案:查看源码了解到事件的触发顺序是下面这样。
ItemChanged->SelectionChanged->更新Text依赖属性->更新EditableText或更新当前选中项(依IsEditable而定)
对于更新Text依赖属性及更新EditableText可以通过设置ComboBox的属性UpdatingText=true避免其执行,而更新当前选中项不容易控制,所以下面代码针对可编辑的ComboBox实现的自定义控件,可以实现Items集合更改时,其Text属性则不会更改,且不会触发TextChanged事件。

public class MyCombox : ComboBox
    {
        private string _previousText;
        private int _previousIndex;

        protected override void OnSelectionChanged( SelectionChangedEventArgs e)
        {
            if (! IsEditable)
            {
                base.OnSelectionChanged(e);
            }
            else
            {
                bool ifCanChangedText = true;
                if (_previousIndex != -1 && SelectedIndex == - 1 && !Items. Contains(_previousText))
                {
                    ifCanChangedText = false ;
                    SetUpdatingText( true);
                }

                base.OnSelectionChanged(e);

                if (! ifCanChangedText)
                    SetUpdatingText( false);

                _previousText = Text;
                _previousIndex = SelectedIndex;
            }
        }

        private void SetUpdatingText(bool val)
        {
            var pro = typeof ( ComboBox). GetProperty("UpdatingText", BindingFlags .Instance | BindingFlags. NonPublic);
            if (null != pro)
                pro .SetValue(this , val);
        }
    }

转载于:https://www.cnblogs.com/maigc249/p/5509841.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值