Définir la valeur par défaut dans WPF ComboBox

J’utilise la liaison de propriété ComboBox ItemsSource pour afficher les éléments d’une liste déroulante.

Voici le code:

 Classes.Charges _selected_tax = new Classes.Charges(); public Classes.Charges SelectedTax { get { return _selected_tax; } set { _selected_tax = value; } } List _taxlist = new List(); public List TaxList { get { return _taxlist; } set { _taxlist = value; OnPropertyChanged("TaxList"); } } 

Il affiche correctement les éléments de la liste déroulante.

Il y a un élément particulier dans TaxList "No Tax" que je veux être sélectionné par défaut dans la liste déroulante. Cet élément peut être présent à n’importe quel index de la liste (premier ou dernier élément non nécessaire).

J’essaie d’utiliser le code suivant pour définir la propriété d’index sélectionnée de la liste déroulante, mais malheureusement, cela ne fonctionne pas.

 TaxList = Classes.Charges.GetChargeList("Tax"); Cmb_Tax.DataContext = this; int i = TaxList.FindIndex(x => x.ChargeName == tax_name); Cmb_Tax.SelectedIndex = i; 

La méthode FindIndex () renvoie correctement l’index de "No Tax" mais lorsque j’essaie de l’assigner à SelectedIndex de la liste déroulante, SelectedIndex ne change pas. Il rest à -1.

Update1

 private void Cmb_Tax_SelectionChanged(object sender, SelectionChangedEventArgs e) { MessageBox.Show(SelectedTax.ChargeName); } 

Update2 Mis à jour le code selon suggéré par @ElecsortingcRouge

  Classes.Charges _selected_tax = new Classes.Charges(); public Classes.Charges SelectedTax { get { return _selected_tax; } set { _selected_tax = value; OnPropertyChanged("SelectedTax"); } } ObservableCollection _taxlist = new ObservableCollection(); public ObservableCollection TaxList { get { return _taxlist; } set { _taxlist = value; OnPropertyChanged("TaxList"); } } public void Load_Tax(ssortingng tax_name = null, Classes.Charges selected_tax = null) { TaxList = Classes.Charges.GetParticularChargeList("Tax"); Cmb_Tax.DataContext = this; //Cmb_Tax.SelectedValue = tax_name; SelectedTax = selected_tax; //int i = TaxList.FindIndex(x => x.ChargeName == tax_name); //Cmb_Tax.SelectedIndex = i; } 

Une idée pourquoi cela doit se passer? Veuillez également suggérer toute autre approche permettant d’afficher les valeurs par défaut dans la liste déroulante.

Voici un exemple de travail:

Viewmodel:

  public MainWindow() { InitializeComponent(); var vm = new ViewModel(); this.DataContext = vm; this.Loaded += (o,e) => vm.LoadData(); } public class ViewModel : INotifyPropertyChanged { private IList taxList; public ICollectionView TaxList { get; private set; } public void LoadData() { taxList = Charges.GetChargeList("taxes"); TaxList = CollectionViewSource.GetDefaultView(taxList); RaisePropertyChanged("TaxList"); TaxList.CurrentChanged += TaxList_CurrentChanged; var noTax = taxList.FirstOrDefault(c => c.ChargeName == "No Tax"); TaxList.MoveCurrentTo(noTax); } void TaxList_CurrentChanged(object sender, EventArgs e) { var currentCharge = TaxList.CurrentItem as Charges; if(currentCharge != null) MessageBox.Show(currentCharge.ChargeName); } public event PropertyChangedEventHandler PropertyChanged; public void RaisePropertyChanged(ssortingng propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } } } 

Vue:

  

La liste INotifyCollectionChanged pas INotifyCollectionChanged rendre ObservableCollection

 ObservableCollection _taxlist = new ObservableCollection(); public ObservableCollection TaxList { get { return _taxlist; } set { _taxlist = value; OnPropertyChanged("TaxList"); } } 

Et essayez de régler le Mode = TwoWay

 SelectedItem="{Binding SelectedTax,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"