Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Le dispatcher Thread de WPF et le databinding

Une des grandes forces de WPF est le databinding. Il est possible de lier le contenu d'un contrôle de type ItemsControl, comme une ListBox, ou ListView, à une collection. Si cette collection implémente l'interface IObservableCollection, la moindre modification du contenu de la collection sera répercutée automatiquement sur le contrôle. Cette particularité de WPF peut faire économiser de nombreuses heures aux développeurs.

Voici un petit exemple, tout d'abord un code XAML :

<Grid x:Name="LayoutRoot">
  <
ItemsControl Name="Messages" Margin="12,12,12,0" Style="{DynamicResource MessagesControlTemplate}"/>

</
Grid>

Ensuite une classe C# :

class Callback
{
    ObservableCollection<Message> messages = new ObservableCollection<Message
>();

    public void ReceiveMessage(Message
message)
    {
        messages.Add(message);
    }

    public IList<Message> Messages
    {
        get { return
messages; }
    }
}

Nous allons maintenant créer une instance de cette classe Callback et lier le contenu de l'ItemsControl à la propriété Messages de cette instance.

Callback callback = new Callback();

Messages.ItemsSource = callback.Messages;

Le tour est joué. Lors d'un appel à la fonction ReceiveMessage, la collection est mise à jour, et le contrôle aussi.

Par contre, ce système a une limitation : la collection ne peut maintenant être modifiée que par le dispatcher thread de WPF. C'est à dire que si ReceiveMessage est appelée depuis l'évènement de clic sur un bouton, cela fonctionnera. Par contre si cela provient d'un thread extérieur à WPF, l'exception suivante sera levée :

This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread.

C'est mon cas, puisqu'en réalité c'est un thread de WCF qui va exécuter la méthode ReceiveMessage. Heureusement, il existe une solution à ce problème : elle consiste à récupérer le dispatcher thread de WPF et à exécuter la méthode dessus :

class Callback
{
    ObservableCollection<Message> messages = new ObservableCollection<Message
>();

    public void ReceiveMessage(Message
message)
    {
        Application app = System.Windows.Application
.Current;
        if (app != null
)
            app.Dispatcher.BeginInvoke(
DispatcherPriority.Background, new DispatcherOperationCallback
(Add), message);
    }

    private object Add(object
str)
    {
        messages.Add((
Message
)str);
        return null
;
    }

    public IList<Message
> Messages
    {
        get { return
messages; }
    }
}

Et cette fois ci, cela fonctionne correctement.

Si vous voulez des informations plus détaillées à ce sujet, je vous conseille d'aller jeter un coup d'oeil à cet article sur le blog de Beatriz Costa.

Publié dimanche 28 janvier 2007 14:26 par RaptorXP
Classé sous : , , , , ,
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

Pas de commentaires
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01