Bonjour,
Avant tout, ne criez pas. Lisez jusqu'au bout.
J'ai un datagrid qui a pour ItemSource un List<MonTypeAMoi>
(pas de ObservableCollection parce que je n'ai pas besoin d'ajouter / supprimer des éléments, et c'est juste pour visualiser)
Les données s'affichent bien à l'initialisation mais après, si l'objet source est modifié, je n'arrive pas à le rafraîchir sauf en faisantCe qui fout en l'air le tri, l'ordre des colonnes si l'utilisateur l'a changé et quelques améliorations spécifiques.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2datagrid1.itemsource = null; datagrid1.itemsource= MaListe;
c'est effectivement un sujet qui a déjà été abordé ici : mais si j'adopte la solution donnée, GetBindingExpression renvoie null parce que _txtInfo1 n'a pas de liaison active.
J'ai ajouté un binding (voir projet exemple ci-joint) mais le updateTarget ne fait rien.
Je suis tombé sur ce lien qui dit que c'est une régression connue (mais ça vient d'un forum, la fiabilité de la source n'est pas forcée). Est-ce que l'un de vous aurait eu cet écho ?
J'ai tenté d'implémenter le INotifyPropertyChanged mais toujours sans résultat (le binding fait bien afficher la collection dans la grille s'il n'y a rien mais ne rafraîchit pas s'il y a déjà quelque chose). Cependant, ça peut venir de moi.
Est-ce que quelqu'un a déjà réussi à rafraîchir la datagrid du WPFToolkit ?
Côté code, voilà la datagrid :J'ai mis AutoGenerateColumn à true parce qu'il ne connaît pas la propriété DataFieldBinding (et puis ça suffit pour l'exemple).
Code : Sélectionner tout - Visualiser dans une fenêtre à part <my:DataGrid AutoGenerateColumns="True" Name="dataGrid1" />
Le code-Behind :Le code complet dans un mini-projet en pièce jointe.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 public partial class Window1 : Window { List<Book> LsBooks; public Window1() { InitializeComponent(); } private void Window_Loaded(object sender, RoutedEventArgs e) { // initialisation collection qui sert de source au datagrid LsBooks = new List<Book>(); LsBooks.Add(new Book(30, "j'ai les cheveux longs", "napoleon")); LsBooks.Add(new Book(30, "le bon gigot d'antan", "maite")); LsBooks.Add(new Book(30, "oui oui et sa voiture jaune", "non non")); dataGrid1.ItemsSource = LsBooks; } /* note sur le refraichissement par binding, si on enlève le "dataGrid1.ItemsSource = LsBooks;" de l'evenement loaded et que l'on execute le projet, puis clique sur le bouton "refresh normal", on voit bien que le binding se fait puisque la datagrid se remplit. * mais s'il y a déjà quelquechose dans la grille, rien ne se passe */ private void button2_Click(object sender, RoutedEventArgs e) { // modification de la source LsBooks[1].price += 1; LsBooks.Add(new Book(20, "Comment rater un tour hihihi", "Garcimore")); // mise en place du binding (serait mieux dans l'evenement loaded mais histoire de tout séparer, je le mets ici) Binding b = new Binding(""); b.Mode = BindingMode.OneWay; b.Source = LsBooks; dataGrid1.SetBinding(ItemsControl.ItemsSourceProperty, b); // création d'un bindingexpression pour lancer le binding quand on veut BindingExpression bindExpression = dataGrid1.GetBindingExpression(ItemsControl.ItemsSourceProperty); // on mets à jour bindExpression.UpdateTarget(); // perdu , ça ne fait rien ... pourquoi ? } } public class Book { public int price { get; set; } public string title { get; set; } public string author { get; set; } public Book(int p, string t, string a) { price = p; title = t; author = a; } }
Partager