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