2012-11-08 9 views
6

Sto utilizzando MVVM per il mio progetto e sto cercando di associare una tabella dal mio database con un DataGrid. Ma quando eseguo la mia applicazione, datagrid è vuoto.MVVM datagrid binding

MainWindow.xaml.cs:

public MainWindow(){ 
     InitializeComponent(); 
     DataContext = new LecturerListViewModel() 
    } 

MainWindow.xaml:

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Source=Lecturers}" > 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Name" Binding="{Binding Name}"/> 
       <DataGridTextColumn Header="Surname" Binding="{Binding Surname}"/> 
       <DataGridTextColumn Header="Phone" Binding="{Binding Phone_Number}" /> 
      </DataGrid.Columns> 
</DataGrid> 

LecturerListViewModel.cs:

public class LecturerListViewModel : ViewModelBase<LecturerListViewModel> 
{ 

    public ObservableCollection<Lecturer> Lecturers; 
    private readonly DataAccess _dataAccess = new DataAccess(); 

    public LecturerListViewModel() 
    { 
     Lecturers = GetAllLecturers(); 
    } 

e ViewModelBase implementa INotifyPropertyChanged.

Lecturer.cs

public class Lecturer 
{ 
    public Lecturer(){} 

    public int Id_Lecturer { get; set; } 
    public string Name { get; set; } 
    public string Surname { get; set; } 
    public string Phone_Number { get; set; } 

Che cosa ho fatto di sbagliato? L'ho controllato con debuger e DataContext contiene tutti i docenti, ma non sono mostrati in datagrid.

risposta

7

Hai un errore nel binding. Prova questo:

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Lecturers}" > 

Codice-behind:

private ObservableCollection<Lecturer> _lecturers = new ObservableCollection<Lecturer>(); 
public ObservableCollection<Lecturer> Lecturers 
{ 
    get { return _lecturers; } 
    set { _lecturers = value; } 
} 

Here è semplice codice di esempio (LecturerSimpleBinding.zip).

+0

Ancora non funziona. Ma ora ci sono solo le intestazioni in Datagrid, con la mia soluzione ho avuto almeno righe vuote – pawel1708hp

+0

@ user1810239 Ho creato il tuo codice di esempio. – kmatyaszek

+0

Grazie mille, funziona. Ecco il problema: // public ObservableCollection Docenti; private ObservableCollection _lecturers = new ObservableCollection (); public ObservableCollection Docenti { get {return _lecturers; } set {_lecturers = value; } } – pawel1708hp

2

Lecturers è un campo, ma il collegamento dati funziona solo con le proprietà. Prova dichiarando Lecturers come:

public ObservableCollection<Lecturer> Lecturers { get; set; } 
6

Eccoci

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Path=Lecturers}" > 

Poi

private ObservableCollection<Lecturer> lecturers; 

public ObservableCollection<Lecturer> Lecturers 
{ 
    get { return lecturers; } 
    set 
    { 
     lecturers = value; 
     this.NotifyPropertyChanged("Lecturers"); 
    } 
} 
6

Sayed Saad precedente è corretto. Vedo due potenziali problemi con il tuo setup, entrambi i quali Sayed si risolve.

  1. L'esempio pubblicato nel doen questione non implementare INotifyPropertyChanged
  2. La proprietà CLR vincolati a deve essere una proprietà pubblica. I campi non funzioneranno, dato che il databindindg funziona tramite la riflessione.
1

MainWindow.xaml.cs: OK

MainWindow.xaml: OK

LecturerListViewModel.cs: OK - assumendo che GetAllLecturers() metodo restituisce una ObservableCollection di Lecturer.

Docente.cs:

public class Lecturer : INotifyPropertyChanged 
{ 
    //public Lecturer(){} <- not necessary 

    private int _id; 
    public int Id 
    { 
     get { return _id; } 
     set 
     { 
      _id = value; 
      OnPropertyChanged("Id"); 
     } 
    } 
    // continue doing the above property change to all the properties you want your UI to notice their changes. 

    ... 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

Controllare questa risposta: Adding INotifyPropertyChanged to Model?