2014-07-12 2 views
1

Je suis nouveau sur WPF et j'ai vu quelques bonnes vidéos sur MVVM et WPF, mais je suis confus quand j'essaie d'afficher une liste de données. Pour une raison quelconque, je n'ai pas de données dans ma liste. Voici ma classeMVVM Pattern Listview

Modèle/Person.cs

class Person : INotifyPropertyChanged 
    { 
     // 1. Fields, Constants 
     private int ID; 
     private string FirstName; 
     private string MiddleName; 
     private string LastName; 
     private DateTime Birthday; 
     private string Prefix; 
     private string Email; 

     public Person(int ID, string FirstName, string MiddleName, string LastName) 
     { 
      this.ID= ID; 
      this.FirstName = FirstName; 
      this.MiddleName = MiddleName; 
      this.LastName = LastName; 
     } 

     /// <summary> 
     /// Get or Sets the person first name 
     /// </summary> 
     public string firstName 
     { 
      get { return FirstName; } 
      set { 
      FirstName = value; 
      OnPropertyChanged("FirstName"); 
      } 
     } 

     /// <summary> 
     /// Get or Sets the person middle name 
     /// </summary> 
     public string middleName 
     { 
      get { return MiddleName; } 
      set { 
       MiddleName = value; 
       OnPropertyChanged("MiddleName"); 
      } 
     } 

     /// <summary> 
     /// Get or Sets the person last name 
     /// </summary> 
     public string lastName 
     { 
      get { return LastName; } 
      set { 
      LastName = value; 
      OnPropertyChanged("LastName"); 
      } 
     } 

     /// <summary> 
     /// Get or Sets the person birthday 
     /// </summary> 
     public DateTime birthday 
     { 
      get { return Birthday; } 
      set { 
       Birthday = value; 
       OnPropertyChanged("Birthday"); 
      } 
     } 


     #region INotifyPropertyChanged Members 

     public event PropertyChangedEventHandler PropertyChanged; 

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

J'ai mon avis/Person.xaml.cs

public partial class Person : Window 
    { 
     public Person() 
     { 
      InitializeComponent(); 
      lvDataBinding.DataContext = new PersonViewModel(); 

     } 
    } 

Le XAML est comme suit:

<ListView Margin="10" Name="lvDataBinding" ItemsSource="{Binding Person}" Grid.Column="1" Width="auto" Grid.ColumnSpan="8" Grid.Row="1"> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn DisplayMemberBinding="{Binding firstName}" Header="First Name" Width="100"/> 
        <GridViewColumn DisplayMemberBinding="{Binding lastName}" Header="Last Name" Width="100"/> 
        <GridViewColumn DisplayMemberBinding="{Binding middleName}" Header="Middle Name" Width="100"/> 
        <GridViewColumn DisplayMemberBinding="{Binding Birthday}" Header="Birthday" Width="100"/> 
       </GridView> 
      </ListView.View> 

     </ListView> 

Dernières pièces mais important ici est mon ViewModel/PersonViewModel.cs

internal class PersonViewModel 
{ 
    public ObservableCollection<Person> myData { get; set; } 

    public PersonViewModel() 
    { 
     List<Person> myData = new List<Person>(); 

    } 

    public ObservableCollection<Person> getData() 
    { 
     myData.Add(new Person(12456, "John", "Francis", "Dufour")); 
     myData.Add(new Person(12456, "Heather", "Meagan", "Cornthwaite")); 
     if (myData.Count > 0) 
     { 
      return myData; 
     } 
     else 
     { 
      return null; 
     } 

    } 
} 

Je suis totalement du tableau ou est-ce quelque chose de très petit qui doit être réparé? Il suit également le modèle MVVM, et à l'avenir je prévois avoir accès à une base de données, ce modèle fonctionne-t-il bien pour moi dans le futur.

+0

Au lieu de mettre à jour la question originale, ajoutez toujours la modification à la fin. Sinon, les réponses postées liées à votre question initiale perdront leur valeur. Vous modifiez complètement le code qu'il était plus tôt lorsque vous avez publié la question. –

Répondre

3

Première de tout nom de la collection est myData et non Person. Donc, changer ItemsSource de se lier à la propriété myData:

<ListView ItemsSource="{Binding myData}"> 

Aussi, je suggère d'utiliser ObservableCollection<T> au lieu de List<T> au cas où vous voulez que votre interface utilisateur mise à jour sur Ajout/suppression de l'élément dans la collecte, car ObservableCollection mettre en œuvre INotifyCollectionChanged qui est responsable de notifier l'interface utilisateur sur tout changement dans la collection.

Remplacer

public List<Person> myData {get; set;} 

avec

public ObservableCollection<Person> myData {get; set;} 

Deuxième, vous ne pouvez lier avec des propriétés et pas de champs. Changez donc tous les champs de la classe Person en propriétés et rendez-les publics.

public int ID {get; set;} // Same for other properties. 

Puisque vous implémentez INotifyPropertyChanged, assurez-vous Déclenchez l'événement correctement de tous les faiseurs de propriété. Ainsi, la propriété idéale devrait ressembler à:

private int id; 
public int ID 
{ 
    get 
    { 
     return id; 
    } 
    set 
    { 
     if(id != value) 
     { 
     id = value; 
     OnPropertyChanged("ID"); 
     } 
    } 
} 

Troisième, propriété de chemin de liaison est sensible à la casse. Assurez-vous d'épeler la liaison correctement:

Cela devrait être Prénom au lieu de Prénom.

<GridViewColumn DisplayMemberBinding="{Binding FirstName}" 
       Header="First Name" Width="100"/> // Same for other columns. 

Quatrième, vous ne rempli les objets de la collection. La méthode getData() n'est jamais appelée. Remplissez la collection dans le constructeur lui-même.

public ObservableCollection<Person> myData {get; set;} 

public PersonViewModel() 
{ 
    myData = new ObservableCollection<Person>(); 
    myData.Add(new Person(12456, "John", "Francis", "Dufour")); 
    myData.Add(new Person(12456, "Heather", "Meagan", "Cornthwaite")); 
} 
+0

J'ai appliqué votre changement et il ne fonctionne toujours pas, je vais mettre à jour le poste pour inclure votre changement et peut-être que je manque quelque chose – Jseb

+0

@Jseb - Voir la mise à jour en réponse. –

+0

Merci beaucoup, je pense que la myData myData a été le problème principal, merci cela a plus de sens. – Jseb

Questions connexes