WPF对ObservableCollection进行排序会取消选择ComboBox

我有一个ComboBox,用户可以在其中选择他们正在处理的JobType。 ComboBox有一个AllJobTypes列表。 问题源于用户添加新JobType时,我将JobType添加到AllJobTypes ObservableCollection,然后对其进行排序。 当排序发生时,ComboBox被取消选择并且不确定原因。 JobConfig.SelectedJobType.Name在此过程中永远不会更改。 有没有办法对可观察的集合进行排序,而不会破坏ComboBox?

public class JobTypeList : ObservableCollection { public void SortJobTypes() { var sortableList = new List(this); sortableList.Sort((x, y) => x.Name.CompareTo(y.Name)); //this works but it creates a bug in the select for JobTypes for (int i = 0; i < sortableList.Count; i++) { this.Move(this.IndexOf(sortableList[i]), i); } } 

而在XAML中

  

您应该将ComboBox的ItemsSource绑定到CollectionViewSource ,而不是在视图模型中对集合进行排序,您可以在其中指定SortDescription

         ...  ...  

有关详细信息,请参阅如何:使用XAML中的视图对数据进行排序和分组

这是使用ItemsSource / SelectedItem的版本。 请注意,您可以向列表中添加新项目并对其进行排序,而不会丢失视图中当前选定的项目。

窗户

           

代码

 public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = new ViewModel(); } } public class Notifier : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected void Notify([CallerMemberName]string property = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property)); } } public class ViewModel : Notifier { private JobType _selectedJobType; private string _newJobType; public JobTypeList JobTypes { get; private set; } public JobType SelectedJobType { get => _selectedJobType; set { _selectedJobType = value; Notify(); } } public string NewJobType { get => _newJobType; set { _newJobType = value; Notify(); AddNewJobType(value); } } public ViewModel() { JobTypes = new JobTypeList(); JobTypes.Add(new JobType { Name = "Butcher" }); JobTypes.Add(new JobType { Name = "Baker" }); JobTypes.Add(new JobType { Name = "LED maker" }); } private void AddNewJobType(string name) { if(JobTypes.Any(x => x.Name == name)) return; JobTypes.Add(new JobType { Name = name }); JobTypes.SortJobTypes(); } } public class JobType : Notifier { private string _name; public string Name { get => _name; set { _name = value; Notify(); } } } 

使用JobTypesList

 public class JobTypeList : ObservableCollection { public void SortJobTypes() { var sortableList = new List(this); sortableList.Sort((x, y) => x.Name.CompareTo(y.Name)); //this works but it creates a bug in the select for JobTypes for(int i = 0; i < sortableList.Count; i++) { this.Move(this.IndexOf(sortableList[i]), i); } } }