2016-12-22 3 views
0

Я пытаюсь связать combobox в WPF. Вот моя XAML:Комбинация привязки WPF

<ComboBox x:Name="cmbRptType" HorizontalAlignment="Left" Margin="10,10,0,0" ItemsSource="{Binding Path=ReportTypes}" SelectedValuePath="Type" DisplayMemberPath="Name" VerticalAlignment="Top" Width="198"> 

     </ComboBox> 

Вот мой код позади:

public ObservableCollection<ReportType> ReportTypes = new ObservableCollection<ReportType>() 
     { 
      new ReportType() { Name = "Store", Type = REPORT_TYPE.STORE }, 
      new ReportType() { Name = "Customer", Type = REPORT_TYPE.CUSTOMERS } 
     }; 

и в конструкторе я поставил:

DataContext = this; 

Но мои пункты не отображаются. Есть что-то еще, что мне нужно сделать?

+1

Сделайте свой ReportTypes собственностью, добавив {get; set;} и ​​создать новый экземпляр в вашем contructor –

+0

Вы не можете привязываться к ** полю **. – Sinatr

+0

Поле и тип полей или свойств ReportType? Они должны быть свойствами. – PaulF

ответ

1

Обратите внимание на приведенный ниже код, не используя _reportTypes и вместо этого используя ReportTypes, приведет к вечному циклу, так как он будет обновляться навсегда.

private ObservableCollection<ReportType> _reportTypes 
public ObservableCollection<ReportType> ReportTypes 
    { 
    get{return _reportTypes;} 
    set 
    { 
     _reportTypes = value; 
     NotifyPropertyChanged(m => m.ReportTypes); 
    } 
    } 

Вы забыли установить геттер и сеттер в ObservableCollection, методы получения и установки очень важно при использовании связывания.

setter принимает значение, которое вы передаете, и устанавливает значение переменной.

Геттер ждет вызова, и при вызове он возвращает значение переменной вызываемому элементу.

выпадающей недвижимость

ItemsSource="{Binding ReportTypes,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 

установка режима и UpdateTrigger также очень важен

с помощью режима вы можете установить способ выпадающие взаимодействует со связыванием.

с UpdateSourceTrigger вы можете сказать выпадающие ждать пункта она привязана к какому будет обновляться, а затем он спрашивает сорбент для обновленных данных

+0

Наблюдаемая коллекция уже реализует INotifyPropertyChanged, вам не нужно это делать снова –

+0

@NawedNabiZada У вас есть, если вы не сообщили NotifyPropertyChanged, это просто не обновляется .... по крайней мере, к моему опыту –

+0

@NawedNabiZada, попробуйте это решение, и вы будем удивлены;) Но в противном случае вы правы: если вы не устанавливаете значение для нового экземпляра, нет необходимости повышать уведомление, например auto-property с геттером будет делать только отлично, включая добавление/удаление элементов. – Sinatr

1

Если ваши детали ComboBox только будут фиксированный список то для достижения привязки вам не требуется наблюдаемая коллекция. Если вы собираетесь изменить ReportTypes и хотите, чтобы эти изменения отразились в combobox, вам необходимо использовать наблюдаемую коллекцию.

public enum REPORT_TYPE 
{ 
    STORE, 
    CUSTOMERS 
} 

public class ReportType 
{ 
    public string Name { get; set; } 
    public REPORT_TYPE Type { get; set; } 
} 

public List<ReportType> ReportTypes { get; set; } = new List<ReportType>() 
{ 
    new ReportType() { Name = "Store", Type = REPORT_TYPE.STORE }, 
    new ReportType() { Name = "Customer", Type = REPORT_TYPE.CUSTOMERS } 
}; 
Смежные вопросы