2017-02-13 18 views
0

У меня есть список объектов (SubjectervableCollection subjectlist) и вы хотите отображать их в Combobox через свойство привязки данных и зависимости.Data-binding ObservableCollection <T> с ComboBox не работает с свойством зависимостей

WPF Data Binding to a Combo Box

Я искал на StackOverflow и пытался реализовать решение Крэйга Suchanec в приведенной выше ссылке. (Пробовал целый день, и я просто не понимаю, что случилось с моим кодом)

MainWindow.xaml.cs

public partial class MainWindow : Window 
{ 
    public static readonly DependencyProperty SubjectListProperty = 
     DependencyProperty.Register("SubjectList", 
     typeof(ObservableCollection<Subject>), 
     typeof(MainWindow)); 



    private ObservableCollection<Subject> subjectList = new ObservableCollection<Subject>(); 
    Initialization init1; 


    public ObservableCollection<Subject> SubjectList 
    { 
     get { return (ObservableCollection<Subject>)GetValue(SubjectListProperty); } 
     // get { return subjectList; } 

    } 


    public MainWindow() 
    { 
     init1 = new Initialization(); 
     subjectList = init1.createMenuSubject(); 

     InitializeComponent(); 
     //this.comboBox.DataContext = SubjectList; 
    } 
} 

MainWindow.xaml

<Grid> 

    <ComboBox x:Name="comboBox" HorizontalAlignment="Left"VerticalAlignment="Top" Width="120" Margin="321,10,0,0" 
          ItemsSource="{Binding ElementName=mainWindow, Path=SubjectList}" DisplayMemberPath="Name"/> 

    </Grid> 

Это действительно работает, если я просто установите DataContext и работайте без свойства зависимостей, но как только я попытаюсь использовать свойство зависимостей для привязки данных, это НЕ, и я не вижу существенной разницы между моей реализацией и решением, указанным в ссылке.

Было бы очень признательно, если бы кто-нибудь мог помочь мне с этой проблемой.

+0

Пожалуйста, внесите фактический код в свой вопрос, а не скриншоты. Форматирование кода легко, просто отступом на четыре пробела. – Clemens

ответ

0

Я не вижу нигде в вашем коде, где вы фактически устанавливаете значение свойства SubjectList.

Вы, однако, устанавливаете значение subjectList, но привязываетесь к SubjectList. Обратите внимание на разницу в корпусе.

+0

Омг, спасибо! Я сменил subjectList на ObjectList и написал набор. Теперь он работает. – morrismoss

0

Вы должны написать:

public ObservableCollection<Subject> SubjectList 
    { 
     set { base.SetValue(SubjectListProperty, value); } 
     get { return (ObservableCollection<Subject>)base.GetValue(SubjectListProperty); } 
    } 

вместо

public ObservableCollection<Subject> SubjectList 
    { 
     set { base.SetValue(SubjectListProperty, value); } 
     get { return subjectList; } 
    } 

или любой другой специальный формат. Вы устанавливаете subjectList в свой конструктор MainWindow(), однако он не будет устанавливать значение SubjectList (with Capital S), и событие изменения свойства никогда не поднимается. Удалить Предметный указатель.

Если вы задаетесь вопросом, почему DataContext подход работает, следует отметить, что будет работать, даже если вы не используете DepenedencyProperty. Однако, если вы реализуете INotifyPropertyChange, он будет работать с настройкой ElementName.

+0

Большое спасибо. Я сменил subjectList на ObjectList в конструкторе и отредактировал аксессор. Теперь он работает! – morrismoss