using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Windows; using System.Windows.Controls; namespace MV485.helper { public partial class MultiSelectComboBox : UserControl, INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } public ObservableCollection Items { get; set; } = new ObservableCollection(); private string _selectedText = "请选择..."; //public string SelectedText //{ // get => _selectedText; // set // { // _selectedText = value; // comboBox.Text = value; // 确保 UI 显示更新 // } //} public string SelectedText { get => _selectedText; set { if (_selectedText != value) { _selectedText = value; OnPropertyChanged(nameof(SelectedText)); // 触发UI更新 } } } public MultiSelectComboBox() { InitializeComponent(); comboBox.ItemsSource = Items; } public void SetItems(string[] itemNames,bool selectAll = true) { Items.Clear(); if (selectAll) { Items.Add(new SelectableItem { Name = "全选", IsSelected = false }); } foreach (var name in itemNames) { Items.Add(new SelectableItem { Name = name, IsSelected = false }); } //comboBox.ItemsSource = null; //comboBox.ItemsSource = Items; comboBox.ItemsSource = Items; UpdateSelectedText(); } private void CheckBox_Changed(object sender, RoutedEventArgs e) { CheckBox checkBox = sender as CheckBox; SelectableItem selectedItem = checkBox.DataContext as SelectableItem; if (selectedItem.Name == "全选") { bool isAllSelected = selectedItem.IsSelected; foreach (var item in Items.Skip(1)) { item.IsSelected = isAllSelected; } } else { if (!selectedItem.IsSelected) { Items[0].IsSelected = false; } else if (Items.Skip(1).All(i => i.IsSelected)) { Items[0].IsSelected = true; } } UpdateSelectedText(); } //private void UpdateSelectedText() //{ // var selectedItems = Items.Skip(1).Where(i => i.IsSelected).Select(i => i.Name); // SelectedText = selectedItems.Any() ? string.Join(", ", selectedItems) : "请选择..."; //} private void UpdateSelectedText() { //var selectedItems = Items.Where(i => i.IsSelected).Select(i => i.Name).ToList(); var selectedItems = Items .Where(i => i.IsSelected && i.Name != "全选") .Select(i => i.Name) .ToList(); SelectedText = selectedItems.Any() ? string.Join(", ", selectedItems) : "请选择..."; OnPropertyChanged(nameof(SelectedText)); } public string GetSelectedItems() { //return string.Join(", ", Items.Skip(1).Where(i => i.IsSelected).Select(i => i.Name)); return string.Join(", ", Items.Where(i => i.IsSelected && i.Name != "全选").Select(i => i.Name)); } public void SetSelectedValues(string values) { if (string.IsNullOrWhiteSpace(values)) return; // 解析字符串,按逗号分割 var selectedList = values.Split(',').Select(v => v.Trim()).ToList(); // 遍历 Items,匹配 Name,更新 IsSelected foreach (var item in Items) { item.IsSelected = selectedList.Contains(item.Name); } // 更新显示的文本 UpdateSelectedText(); } private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { comboBox.SelectedItem = null; } private void ComboBoxItem_PreviewMouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) { if (sender is ComboBoxItem item && item.DataContext is SelectableItem data) { data.IsSelected = !data.IsSelected; // 切换选中状态 UpdateSelectedText(); // 更新显示文字 // 防止 ComboBox 默认选中行为(不然还是会出现“MV485.helper.SelectableItem”) comboBox.SelectedItem = null; e.Handled = true; } } private void ComboBox_DropDownClosed(object sender, System.EventArgs e) { // 恢复文本显示 UpdateSelectedText(); } //-------------------------------------------------------------------------------- } public class SelectableItem : System.ComponentModel.INotifyPropertyChanged { private bool _isSelected; public string Name { get; set; } public bool IsSelected { get => _isSelected; set { _isSelected = value; PropertyChanged?.Invoke(this, new System.ComponentModel.PropertyChangedEventArgs(nameof(IsSelected))); } } public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; } }