2014-02-03 6 views
4

Я использую свойство ComboBox ItemsSource для отображения элементов из списка в поле со списком.Установить значение по умолчанию в WPF ComboBox

Ниже приводится код:

<ComboBox x:Name="Cmb_Tax" ItemsSource="{Binding TaxList}" 
      DisplayMemberPath="ChargeName" SelectedItem="{Binding 
      SelectedTax,UpdateSourceTrigger=PropertyChanged}" IsEditable="True" 
      IsTextSearchEnabled="True" SelectionChanged="Cmb_Tax_SelectionChanged"/> 

Classes.Charges _selected_tax = new Classes.Charges(); 
public Classes.Charges SelectedTax 
{ 
    get 
    { 
     return _selected_tax; 
    } 
    set 
    { 
     _selected_tax = value; 
    } 
} 

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

Он отображает элементы в поле со списком правильно.

В TaxList "No Tax" есть определенный пункт, который я хочу выбрать по умолчанию в поле со списком. Этот элемент может присутствовать в любом индексе в списке (необязательный первый или последний элемент списка).

Я пытаюсь использовать следующий код, чтобы установить свойство выбранного индекса в поле со списком, но, к сожалению, он не работает.

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

Метод FindIndex() возвращает индекс "No Tax" правильно, но при попытке присвоения его SelectedIndex комбо SelectedIndex не меняется. Он остается равным -1.

Update1

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

Update2 Обновленный код согласно предложению @ElectricRouge

<ComboBox x:Name="Cmb_Tax" ItemsSource="{Binding TaxList, Mode=TwoWay}" 
         DisplayMemberPath="ChargeName" SelectedItem="{Binding SelectedTax,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" 
         IsEditable="True" IsTextSearchEnabled="True" 
         SelectionChanged="Cmb_Tax_SelectionChanged"/> 


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

     ObservableCollection<Classes.Charges> _taxlist = new ObservableCollection<Classes.Charges>(); 
     public ObservableCollection<Classes.Charges> TaxList 
     { 
      get 
      { 
       return _taxlist; 
      } 
      set 
      { 
       _taxlist = value; 
       OnPropertyChanged("TaxList"); 
      } 
     } 

public void Load_Tax(string 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; 
     } 

Любая идея, почему это должно происходить? Также предлагайте любой другой подход к отображению по умолчанию в поле со списком.

+1

мне интересно посмотреть, что делает ваш 'метод Cmb_Tax_SelectionChanged'. Можете ли вы предоставить это, чтобы мы могли лучше понять проблему? – deloreyk

+0

Пробовал ли вы установить свой элемент 'SelectedTax' (что указывает ссылка на ваш SelectedItem), а не устанавливать' SelectedIndex' в поле со списком? – blins

+0

Пытался извлечь и присвоить объект Selected Tax без объекта «No Tax», но все равно не повезло :( –

ответ

3

Вот рабочий образец:

ViewModel:

public MainWindow() 
    { 
     InitializeComponent(); 

     var vm = new ViewModel(); 
     this.DataContext = vm; 
     this.Loaded += (o,e) => vm.LoadData(); 
    } 

    public class ViewModel : INotifyPropertyChanged 
    { 
     private IList<Charges> 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(string propertyName) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 
} 

Вид:

<ComboBox x:Name="cboTaxList" 
       ItemsSource="{Binding TaxList}" 
       DisplayMemberPath="ChargeName" 
       IsSynchronizedWithCurrentItem="True" /> 
0

Список не реализует INotifyCollectionChanged сделать его ObservableCollection

ObservableCollection<Classes.Charges> _taxlist = new ObservableCollection<Classes.Charges>(); 
public ObservableCollection<Classes.Charges> TaxList 
{ 
    get 
    { 
     return _taxlist; 
    } 
    set 
    { 
     _taxlist = value; 
     OnPropertyChanged("TaxList"); 
    } 
} 

И попробуйте установить режим = TwoWay

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

после этого следует присвоить значение SelectedTax? Будет ли он затем отражать в combo? –

+0

попробовал ваш код и попытался присвоить значение SelectedTax.В комбо нет значения –

+0

Да также реализует 'OnPropertyChanged' на' SelectedTax' – ElectricRouge

Смежные вопросы