mack
mack

Reputation: 2965

WPF Binding Combobox to LINQ Populated Observable Collection

This is the first experience with WPF so please forgive me, I know this is pretty basic but I can't get it to work. I'm simply trying to bind a combobox to an LINQ to EF populated ObservableCollection. When I step through the code I see that the collection is populated, but the combo box doesn't display the contents of the collection.

Here is my ViewModel:

public class MainWindowViewModel : ViewModelBase
{
  # region ObservableCollections

  private ObservableCollection<Site> _sitescollection;
  public ObservableCollection<Site> SiteCollection
  {
       get { return _sitescollection;}
       set {
            if (value == _sitescollection) return;
            _sitescollection = value;
            RaisePropertyChanged("SiteCollection");
       }
  }

  # endregion


  public MainWindowViewModel()
  {
       this.PopulateSites();
  }

  // Get a listing of sites from the database
  public void PopulateSites()
  {

       using (var context = new Data_Access.SiteConfiguration_Entities())
       {
            var query = (from s in context.SITE_LOOKUP
                         select new Site(){Name = s.SITE_NAME, SeqId = s.SITE_SEQ_ID });

            SiteCollection = new ObservableCollection<Site>(query.ToList());

       }
  }

}

My Site Class:

public class Site : INotifyPropertyChanged
{
  #region Properties

  string _name;
  public string Name
  {
       get
       {
            return _name;
       }
       set
       {
            if (_name != value)
            {
                 _name = value;
                 RaisePropertyChanged("Name");
            }
       }
  }

  private int _seqid;
  public int SeqId
  {
       get { 
            return _seqid; 
       }
       set { 
            if (_seqid != value)
            {
                 _seqid = value;
                 RaisePropertyChanged("SeqId");
            } 
       }
  }

  #endregion

  #region Constructors
  public Site() { }

  public Site(string name, int seqid)
  {
       this.Name = name;
       this.SeqId = seqid;
  }

  #endregion

  void RaisePropertyChanged(string prop)
  {
       if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(prop)); }
  }
  public event PropertyChangedEventHandler PropertyChanged;
}

And my XAML Bindings:

                <ComboBox Margin="10" 
                          ItemsSource="{Binding Sites}"
                          DisplayMemberPath="Name" 
                          SelectedValuePath="SeqId" />

What am I doing wrong? Any assistance would be greatly appreciated.

Upvotes: 2

Views: 905

Answers (1)

BradleyDotNET
BradleyDotNET

Reputation: 61339

You bound to path "Sites" but your property name was "SiteCollection".

You bind to properties, so the names have to match. Also make sure your data context is set to your view model object.

Upvotes: 3

Related Questions