WPF 自定义ComboBox样式,自定义多选控件


引用网址:

一、ComboBox基本样式

ComboBox有两种状态,可编辑和不可编辑状态。通过设置IsEditable属性可以切换控件状态。

先看基本样式效果:

基本样式代码如下:


        
        
        
        
        
        
        
        
        
                
            
            
                
                    
                        

                            
                                
                                
                            
                            
                            

                            
                            
                            
                            

                            
                            
                                
                                    
                                    
                                        
                                        
                                    
                                
                            
                        
                        
                            
                                
                            
                        
                    
                
            
        

引用示例:

 
          
          
          
          

二、ComboBox扩展样式(多选控件)

ComBoBox能够单选选择数据,那么能不能实现多选的操作呢,答案是肯定的。这里多选的自定义控件参考了博主“梦里花落知多少”的内容。我对样式做了补充,使其能够更方便的进行移除多选的内容。同时也更好的展示了已选的内容,大家可以根据实际需求做出更好的展示效果。

先看效果:

2.1、添加自定义控件MultiComboBox

 public class MultiComboBox : ComboBox
    {
        static MultiComboBox()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(MultiComboBox), new FrameworkPropertyMetadata(typeof(MultiComboBox)));
        }


        private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            d.SetValue(e.Property, e.NewValue);
        }



        /// 
        /// 选中项列表
        /// 
        public ObservableCollection ChekedItems
        {
            get { return (ObservableCollection)GetValue(ChekedItemsProperty); }
            set { SetValue(ChekedItemsProperty, value); }
        }

        public static readonly DependencyProperty ChekedItemsProperty =
            DependencyProperty.Register("ChekedItems", typeof(ObservableCollection), typeof(MultiComboBox), new PropertyMetadata(new ObservableCollection(), OnPropertyChanged));



        /// 
        /// ListBox竖向列表
        /// 
        private ListBox _ListBoxV;

        /// 
        /// ListBox横向列表
        /// 
        private ListBox _ListBoxH;

        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            _ListBoxV = Template.FindName("PART_ListBox", this) as ListBox;
            _ListBoxH = Template.FindName("PART_ListBoxChk", this) as ListBox;
            _ListBoxH.ItemsSource = ChekedItems;
            _ListBoxV.SelectionChanged += _ListBoxV_SelectionChanged;
            _ListBoxH.SelectionChanged += _ListBoxH_SelectionChanged;

            if (ItemsSource != null)
            {
                foreach (var item in ItemsSource)
                {
                    MultiCbxBaseData bdc = item as MultiCbxBaseData;
                    if (bdc.IsCheck)
                    {
                        _ListBoxV.SelectedItems.Add(bdc);
                    }
                }
            }
        }

        private void _ListBoxH_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            foreach (var item in e.RemovedItems)
            {
                MultiCbxBaseData datachk = item as MultiCbxBaseData;

                for (int i = 0; i < _ListBoxV.SelectedItems.Count; i++)
                {
                    MultiCbxBaseData datachklist = _ListBoxV.SelectedItems[i] as MultiCbxBaseData;
                    if (datachklist.ID == datachk.ID)
                    {
                        _ListBoxV.SelectedItems.Remove(_ListBoxV.SelectedItems[i]);
                    }
                }
            }
        }

        void _ListBoxV_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            foreach (var item in e.AddedItems)
            {
                MultiCbxBaseData datachk = item as MultiCbxBaseData;
                datachk.IsCheck = true;
                if (ChekedItems.IndexOf(datachk) < 0)
                {
                    ChekedItems.Add(datachk);
                }
            }

            foreach (var item in e.RemovedItems)
            {
                MultiCbxBaseData datachk = item as MultiCbxBaseData;
                datachk.IsCheck = false;
                ChekedItems.Remove(datachk);
            }
        }

        public class MultiCbxBaseData
        {
            private int _id;
            /// 
            /// 关联主键
            /// 
            public int ID
            {
                get { return _id; }
                set { _id = value; }
            }

            private string _viewName;
            /// 
            /// 显示名称
            /// 
            public string ViewName
            {
                get { return _viewName; }
                set
                {
                    _viewName = value;
                }
            }

            private bool _isCheck;
            /// 
            /// 是否选中
            /// 
            public bool IsCheck
            {
                get { return _isCheck; }
                set { _isCheck = value;}
            }
        }
    }

2.2、定义MultiComboBox控件的样式

 
        
            
            
        
        
            
                
                    
                        
                    
                
                
            
        
    

    
    
                                        
                                    

                                    
                                    
                                
                            
                        
                        
                        
                            
                                
                                    
                                        
                                    
                                    
                                        
                                            
                                                
                                                
                                            
                                            
                                                
                                                    
                                                
                                                
                                                    
                                                
                                            
                                        
                                    
                                
                            
                        
                    
                    
                
            
        
    

2.3、引用示例:

2.4、后台代码(初始化绑定数据):

  public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            MultiComboBoxList = new ObservableCollection()
            {
                new MultiCbxBaseData(){
                    ID=0,
                    ViewName="张三",
                    IsCheck=false
                },
                new MultiCbxBaseData(){
                    ID=1,
                    ViewName="李四",
                    IsCheck=false
                },
                new MultiCbxBaseData(){
                    ID=2,
                    ViewName="王五",
                    IsCheck=false
                },
                new MultiCbxBaseData(){
                    ID=3,
                    ViewName="马六",
                    IsCheck=false
                },
                 new MultiCbxBaseData(){
                    ID=4,
                    ViewName="赵七",
                    IsCheck=false
                },
            };
            this.multiCmb.ItemsSource = MultiComboBoxList;
        }

        private ObservableCollection MultiComboBoxList;
    }

所有代码已经上传到github:https://github.com/cmfGit/WpfDemo.git

作者:一叶知秋

相关