2010-03-30 2 views
0

Tout d'abord, je dois dire que je suis absolument nouveau pour WPF! Je pense que j'ai un problème avec WPF ou notifications « Liaisons PropertyChanged » ...Dans ma listview l'événement PropertyChanged ne déclenche jamais la liste à redessiner

Je cette XAML avec un TextBlock et un listView

<StackPanel Orientation="Horizontal"> 
         <TextBlock Margin="2" Name="UpdatesOperationResultcaption" Text="Operation result:" FontSize="12" Foreground="SteelBlue" Grid.Column="1" Height="21" VerticalAlignment="Top" TextAlignment="Left" /> 
         <TextBlock Margin="2" Name="UpdatesOperationResult" Text="{Binding Path=viewModelData.UploadProgressText}" FontSize="12" Foreground="SteelBlue" Grid.Column="1" Height="21" VerticalAlignment="Top" TextAlignment="Left" Width="134.431" /> 
        </StackPanel> 
        <ListView Grid.Column="1" Margin="1" ItemsSource="{Binding Path= viewModelData.MyPendingTasks, diag:PresentationTraceSources.TraceLevel=High}" Name="TasksListView" SelectionMode="Multiple" BorderThickness="1" FontSize="11" Height="110" SelectionChanged="TasksListView_SelectionChanged"> 
         <ListView.View> 
          <GridView> 
           <GridViewColumn Header="Task to execute" Width="350" DisplayMemberBinding="{Binding Path=taskFriendlyName,Converter={StaticResource debugConverter}, diag:PresentationTraceSources.TraceLevel=High}" /> 
           <GridViewColumn Header="Value" Width="60" DisplayMemberBinding="{Binding Path=taskValuetoShow}" /> 
          </GridView> 
         </ListView.View> 
        </ListView> 

Puis dans le code derrière je cette classe, qui devrait gérer les données à afficher ...

public class ViewModelData : INotifyPropertyChanged 
{ 
    int dummy = 0; 
    private string uploadProgressString; 
    private List<TaskToAccomplish> myPendingTasks = new List<TaskToAccomplish>(); 

    public ViewModelData() 
    { 
     uploadProgressString = "0 %"; 
     TaskToAccomplish tempTask = new TaskToAccomplish("TEST", "99 %", 0, "dummy", "dummy"); 
     myPendingTasks.Add(tempTask); 
     tempTask = new TaskToAccomplish("TEST2", "100 %", 0, "dummy", "dummy"); 
     myPendingTasks.Add(tempTask); 
    } 

    public string UploadProgressText 
    { 
     get 
     { 
      return this.uploadProgressString; 
     } 
     set 
     { 
      if (value != this.uploadProgressString) 
      { 
       this.uploadProgressString = value; 
       NotifyPropertyChanged("UploadProgressText"); 
      } 
     } 
    } 

    public List<TaskToAccomplish> MyPendingTasks 
    { 
     get 
     { 
      return myPendingTasks; 
     } 
     set 
     { 
      myPendingTasks.Clear(); 
      foreach (TaskToAccomplish task in value) 
      { 
       myPendingTasks.Add(task); 
      } 

      NotifyPropertyChanged("MyPendingTasks"); 
      NotifyPropertyChanged("taskFriendlyName"); 
      NotifyPropertyChanged("taskValuetoShow"); 


      uploadProgressString = dummy.ToString(); 
      NotifyPropertyChanged("UploadProgressText"); 
      dummy++; 

     } 
    } 

    protected void NotifyPropertyChanged(String propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
} 

C'est ma situation: dans le constructeur de la classe j'ai mis quelques articles faux juste pour montrer quelque chose sur l'écran (et peut-être déboguer la liaison s). Au démarrage, tout va bien. Lorsque je mets à jour mes données en définissant une nouvelle valeur à la liste, le bloc de texte lié au fichier uploadProgressString est mis à jour, tandis que le listview n'est pas affecté. dans la fenêtre de sortie, je vois que l'événement PropertyChanged atteint le ListView:

System.Windows.Data Attention: 91: BindingExpression (hash = 17842833): événement Got PropertyChanged de ViewModelData (hash = 8442299) System.Windows. Avertissement de données: 97: BindingExpression (hash = 17842833): GetValue au niveau 1 de ViewModelData (hash = 8442299) en utilisant RuntimePropertyInfo (MyPendingTasks): Liste 1 (hash=63249743 Count=2) System.Windows.Data Warning: 76 : BindingExpression (hash=17842833): TransferValue - got raw value List 1 (hash = 63249743 Count = 2) System.Windows.Data Avertissement: 85: BindingExpression (hash = 17842833): TransferValue - en utilisant la valeur finale List`1 (hash = 63249743 Count = 2)

Mais rien sur le GridViewColumn. Chaque fois que l'événement est levé, ma liste getter est invoquée, néanmoins la liste n'est pas mise à jour avec les nouvelles valeurs. Où est mon erreur? Merci

Répondre

0

Veuillez clarifier vos fixations. Deux utilisent viewModelData.XXX, deux utilisent directement XXX. Qu'est-ce que DataContext?

Et lorsqu'une liste est liée, utilisez une ObservableCollection <>, pas une Liste <>. Lorsqu'une liste est liée, WPF recherche INotifyCollectionChanged (que List n'implémente pas), pas INotifyPropertyChanged (bien, il peut l'utiliser, mais pour la liste elle-même, pas pour les éléments de la liste).

+0

Mon application est un gâchis de thread et l'utilisation de ObservableCollection était presque impossible ... c'est pourquoi j'ai décidé d'opter pour une liste. Maintenant, je vais essayer d'implémenter INotifyCollectionChanged, je vous le ferai savoir! – damiano

1

J'ai le même problème. En raison de l'utilisation de nombreux threads je ne peux pas utiliser ObervableCollection<>. Ma solution consiste à utiliser deux listes privées et à les modifier. L'instance est donc modifiée et INotifyPropertyChanged fonctionne. Mais cela ne pourrait pas être la bonne façon de résoudre ce problème. En utilisant INotifyCollectionChanged est un peu plus difficile alors INotifyPropertyChanged.

Questions connexes