2012-12-27 9 views
2

S'il vous plaît étudier ce qui suit DataModelAffichage des données dans un DataGrid (MVVM)

Depuis que je suis nouveau ici je ne peux pas poster des images, donc je vais essayer une autre méthode ...

entité d'emploi -jobid -jobNo -jobStatus (clé étrangère de l'entité Etat) -jobDate

entité Statut -statusId -statusCaption

Relation emploi Entité * ----------- 0..1 Statut Entité

J'ai un service WCF qui expose le modèle à accéder par mon JobsViewModel

namespace PM.DataService 
{ 
    [ServiceContract] 
    public class PMService 
    { 
     [OperationContract] 
     public ObservableCollection<Job> GetAllJobs() 
     { 
      using (var context = new logisticDBEntities()) 
      { 
       var result = context.Jobs.ToList(); 
       result.ForEach(e => context.Detach(e)); 
       return new ObservableCollection<Job>(result); 
      } 
     } 

     [OperationContract] 
     public ObservableCollection<Status> GetStatuses() 
     { 
      using (var context = new logisticDBEntities()) 
      { 
       var result = context.Statuses.ToList(); 
       result.ForEach(e => context.Detach(e)); 
       return new ObservableCollection<Status>(result); 
      } 
     }   
    } 
} 

namespace PM.UI.ViewModel 
{ 
    public class JobsViewModel:INotifyPropertyChanged 
    { 
    private PMServiceClient serviceClient = new PMServiceClient(); 

    public JobsViewModel() 
    { 
     this.RefreshStatuses(); 
     this.RefreshAllJobs(); 
    } 

    private void RefreshAllJobs() 
    { 
     this.serviceClient.GetAllJobsCompleted += (s, e) => 
     { 
      this.allJobs = e.Result; 
     }; 
     this.serviceClient.GetAllJobsAsync(); 
    } 

    private void RefreshStatuses() 
    { 
     this.serviceClient.GetStatusesCompleted += (s, e) => 
     { 
      this.Statuses = e.Result; 
     }; 
     this.serviceClient.GetStatusesAsync(); 
    } 

    private ObservableCollection<Job> allJobs; 
    public ObservableCollection<Job> AllJobs 
    { 
     get{ 
      return this.allJobs; 
     } 
     set 
     { 
      this.allJobs = value; 
      OnPropertyChanged("AllJobs"); 
     } 
    } 

    private ObservableCollection<Status> statuses; 
    public ObservableCollection<Status> Statuses 
    { 
     get 
     { 
      return this.statuses; 
     } 

      set 
      { 
       this.statuses = value; 
       this.OnPropertyChanged("Statuses"); 
      } 
     } 

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

J'inclus le JobsViewModel dans le XAML de mon MainWindow

<Window x:Class="PM.FullClient.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:PM.UI" 
    xmlns:vms="clr-namespace:PM.UI.ViewModel" 
    Title="MainWindow" Height="475" Width="575"> 
<Window.DataContext> 
    <vms:JobsViewModel/> 
</Window.DataContext> 
.... 

Maintenant, je peux facilement remplir un DataGrid sur mon MainWindow en se liant à montrer tous les états

<DataGrid ItemsSource="{Binding Path=Statuses}" Margin="7,8,9,8" AutoGenerateColumns="True"> 

et il fonctionne, mais je ne peux pas montrer la sortie parce que je ne peux pas poster des images ici

Mais quand j'essaie de faire la même chose avec Jobs ... Rien ne se passe. Le DataGrid est VIDES

<DataGrid AutoGenerateColumns="True" ItemsSource="{Binding Path=AllJobs}" Margin="6"> 
</DataGrid> 

Je suis passé par beaucoup de menthods ont fouillé des tonnes de sites et fourms et enfin je suis ici.

Est-ce qu'il peut s'agir de la relation Statut> Travail entre les travaux et les statuts? Si oui, comment puis-je résoudre ce problème et si ce n'est pas ce que je fais mal?

+0

Vérifiez que les données dans la propriété alljobs sont remplies ... BTW INotifyPropertychanged n'est pas nécessaire dans votre cas. – paritosh

+0

Je pense que vous devriez mentionner la différence entre les classes 'Job' et' Status'. – Ramin

+0

@paritosh: Le ViewModel utilise un service asynchrone pour extraire des données, donc INotifyPropertyChanged est en fait nécessaire lorsque les données arrivent finalement. – Sphinxxx

Répondre

3

Le problème est que dans les RefreshAllJobs() rappel, vous définissez les allJobs champ (minuscule « a »), et non les AllJobs propriété (majuscules « A »), puis OnPropertyChanged() ne reçoit jamais d'appel de la propriété setter.

+0

Bonne observation. +1 –

Questions connexes