2012-11-08 9 views
6

मैं अपने प्रोजेक्ट के लिए एमवीवीएम का उपयोग कर रहा हूं और मैं डेटाग्रिड के साथ अपने डेटाबेस से एक टेबल बांधने की कोशिश कर रहा हूं। लेकिन जब मैं अपना आवेदन चलाता हूं तो डाटाग्रिड खाली होता है।एमवीवीएम डाटाग्रिड बाध्यकारी

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(); 
    } 

और ViewModelBase लागू IotifyPropertyChanged।

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; } 

मैं गलत क्या किया? मैंने इसे डीबगर के साथ चेक किया और डेटाकॉन्टेक्स्ट में सभी व्याख्याता शामिल हैं, लेकिन डेटाग्रिड में थ्रेड नहीं दिखाए जाते हैं।

उत्तर

7

आपको बाध्यकारी में एक त्रुटि है। इस प्रयास करें:

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

कोड-पीछे:

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

Here सरल उदाहरण कोड (LecturerSimpleBinding.zip) है।

+0

फिर भी काम नहीं कर रहा। लेकिन अब डाटाग्रिड में केवल हेडर हैं, मेरे समाधान के साथ कम से कम खाली पंक्तियां – pawel1708hp

+0

@ user1810239 मैंने आपको नमूना कोड बनाया है। – kmatyaszek

+0

आपको बहुत बहुत धन्यवाद, यह काम करता है। यहां समस्या थी: // सार्वजनिक पर्यवेक्षण चयन व्याख्याता; निजी पर्यवेक्षण चयन _lecturers = नया पर्यवेक्षण चयन (); सार्वजनिक पर्यवेक्षण चयन व्याख्याता { {वापसी _ चयनकर्ता प्राप्त करें; } सेट {_lecturers = मान; } } – pawel1708hp

2

Lecturers एक फ़ील्ड है, लेकिन डेटा बाध्यकारी केवल गुणों के साथ काम करता है। Lecturers की तरह घोषित करने का प्रयास करें:

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

ये हम चले

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

फिर

private ObservableCollection<Lecturer> lecturers; 

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

सैयद साद ऊपर सही है। मुझे आपके सेटअप के साथ दो संभावित समस्याएं दिखाई देती हैं, जिनमें से दोनों सईद हल हो जाते हैं।

  1. उदाहरण सवाल Doen में तैनात INotifyPropertyChanged
  2. CLR संपत्ति को लागू नहीं एक सार्वजनिक संपत्ति होना चाहिए करने के लिए बाध्य किया जा रहा। फील्ड काम नहीं करेंगे, क्योंकि डेटाबेसविंग प्रतिबिंब के माध्यम से काम करता है।
1

MainWindow.xaml.cs: ठीक है

MainWindow.xaml: ठीक है

LecturerListViewModel.cs: ठीक है - यह सोचते हैं कि GetAllLecturers() विधि Lecturer के ObservableCollection देता है।

व्याख्याता।सीएस:

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)); 
     } 
    } 
} 

चेक इस उत्तर: Adding INotifyPropertyChanged to Model?

संबंधित मुद्दे