Comment puis-je mettre à jour une ObservableCollection élément du bien de changer dans un WPF DataGrid?
J'ai un WPF DataGrid qui est de la source de données est une ObservableCollection. Il est mis en place sans serrer comme suit:
public class ItemDataCollection : ObservableCollection<ItemData>
{
}
public class ItemData : INotifyPropertyChanged
{
private bool _selected = true;
public bool Selected
{
get
{
return _selected;
}
set
{
if (value != _selected)
{
_selected = value;
NotifyPropertyChanged("Selected");
}
}
}
}
_itemDataCol = new ItemDataCollection();
<... fill the _itemDataCol with data here ...>
dataGrid1.ItemsSource = _itemDataCol;
Quand la collection est mise à jour, un dataGrid1.Éléments.Refresh() met à jour dataGrid1 bien. Cependant quand je modifie le "Choisi" la propriété d'une ligne en cochant ou décochant la case dans la rangée correspondant à cette propriété, l'élément de la collection ne sont pas mises à jour. J'ai regardé dans l'événement CollectionChanged de la ObeservableCollection, mais ce n'est pas figurant pour obtenir triggerd. Ce câblage dois-je obtenir la dataGrid1 de mise à jour de la collection.
Mise à jour
Tout ce que je faisais réglage de la ItemSource propriété de l'ObservableCollection et de laisser les colonnes d'auto-générer. Depuis, j'ai changé de lier directement, et trouvé plus de détails sur le problème. Quand j'ai cocher simplement la case - aucune notification n'est triggerd. Cependant, si j'ai frappé après vérification de la boîte, puis la collection est mise à jour. Voici la liaison:
<DataGridCheckBoxColumn Binding="{Binding Path=Selected, Mode=TwoWay}" Header="Selected"></DataGridCheckBoxColumn>
Donc je suppose que la question est comment puis-je obtenir la mise à jour avec le fait d'avoir à frapper après cochant ou décochant la case?
Mise à jour #2
(Je ne peux pas répondre comme mon rep n'est pas assez élevé encore)
OK je pense avoir la solution. Si je comprend "UpdateSourceTrigger=PropertyChanged" dans la liaison tout semble fonctionner.
<DataGridCheckBoxColumn Binding="{Binding Path=Selected, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Header="Selected"></DataGridCheckBoxColumn>
Veuillez laisser des commentaires s'il y a des effets négatifs de ce que j'ai peut-être manquant. Merci pour l'aide!
OriginalL'auteur K J | 2012-04-02
Vous devez vous connecter pour publier un commentaire.
CollectionChanged est pour Insérer et Supprimer. NotifyPropertyChanged est pour la mise à jour d'un des éléments. Dans le code que vous avez posté n'est pas réellement implémenter INotifyPropertyChanged.
Et je pense que c'est plus propre de se lier à une propriété publique où vous retournez _itemDataCol
Sinon Bidirectionnels réponse de celopez3
Fait-il appelé? Ne mettre appelée? S'il vous plaît essayer de liaison à une propriété publique. Si tout cela échoue, essayez d'ignorer vous ItemDataCollection et de fournir une ObservableCollection<ItemData> directement (pour les tests).
J'ai essayé les suivants: <DataGridCheckBoxColumn Binding="{Binding Path=Sélectionnés, Mode=TwoWay}" Header="Selected"></DataGridCheckBoxColumn> Selected est public. Le problème s'avère que si je hit <enter> après cochant ou décochant la case, l'ObservableCollection est mis à jour. Simplement en cochant la case n'est pas suffisante pour déclencher la mise à jour.
Vous devez définir le UpdateSourceTrigger à PropertyChanged msdn.microsoft.com/en-us/library/...
OriginalL'auteur paparazzo
Un
ObservableCollection
n'écoute pas ses élémentsINotifyPropertyChanged
événements; utiliser unBindingList
à la place.http://xceed.com/CS/blogs/dontpanic/archive/2009/04/01/i-notify-we-notify-we-all-wait-no-we-don-t.aspx
OriginalL'auteur Aphex
Je ne suis pas sûr que vous avez mis assez d'informations dans votre post, mais je vais essayer de l'aider. Une de mes première question est: comment êtes-vous liant à la case à cocher? Il faut noter que si vous souhaitez que la case à affecter les observables de la collection de l'institut un "two-way" bind sur l'élément, par défaut, la liaison est "one-way" et ne change pas automatiquement l'article dans votre collection. Une autre façon de gérer ce qui serait d'ajouter un événement sur la case à cocher lorsque vous cliquez dessus vous modifiez manuellement la valeur dans la collection observable.
OriginalL'auteur celopez3
La réponse est que je devais définir le UpdateSourceTrigger à PropertyChanged (voir Blam réponse). La liaison bidirectionnelle ne semblent pas avoir besoin d'être spécifié. Voici le balisage du code de travail:
C'est étrange comme il vous montre à la fois acceptée et adoptée aujourd'hui. La réponse montre une coche mais je n'ai pas de crédit. S'il vous plaît essayez un simple clic sur la case à cocher. Et si je ne reçois pas de crédit, alors pas de problème. Bon vous l'ai eu de travail.
Hmm. J'ai essayé unaccepting et d'accepter de nouveau. Il n'montrer votre post que l'on a accepté de répondre - au moins dans mon navigateur sur des machines différentes. Mes excuses - vous avez été le premier à en poster et le crédit doit être la vôtre. Qu'est-ce que je reçois pour jouer avec quelque chose qui n'est pas cassé...
Avez-vous essayer d'accepter votre réponse? Je parie que c'est ce qui a tué ma réponse.
OriginalL'auteur K J