| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 | using System;using System.Collections.Generic;using System.Collections.ObjectModel;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Controls;using System.Windows;using System.ComponentModel;namespace PunkHPX8_Themes.CustomControls{    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);        }        /// <summary>        /// 选中项列表        /// </summary>        public ObservableCollection<MultiCbxBaseData> ChekedItems        {            get { return (ObservableCollection<MultiCbxBaseData>)GetValue(ChekedItemsProperty); }            set { SetValue(ChekedItemsProperty, value); }        }        public static readonly DependencyProperty ChekedItemsProperty =            DependencyProperty.Register("ChekedItems", typeof(ObservableCollection<MultiCbxBaseData>), typeof(MultiComboBox), new PropertyMetadata(new ObservableCollection<MultiCbxBaseData>(), OnPropertyChanged));        /// <summary>        /// ListBox竖向列表        /// </summary>        private ListBox _ListBoxV;        /// <summary>        /// ListBox横向列表        /// </summary>        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 : INotifyPropertyChanged        {            public event PropertyChangedEventHandler PropertyChanged;            private int _id;            /// <summary>            /// 关联主键            /// </summary>            public int ID            {                get { return _id; }                set { _id = value; }            }            private string _viewName;            /// <summary>            /// 显示名称            /// </summary>            public string ViewName            {                get { return _viewName; }                set                {                    _viewName = value;                    OnPropertyChanged("ViewName");                }            }            private bool _isCheck;            /// <summary>            /// 是否选中            /// </summary>            public bool IsCheck            {                get { return _isCheck; }                set                 {                    OnPropertyChanged("IsCheck");                    _isCheck = value;                 }            }            public virtual void OnPropertyChanged(string propertyName)            {                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));            }        }    }}
 |