2010-07-19 3 views
3

Dire que j'ai le code suivant:Comment puis-je mettre à jour un WPF lier immédiatement

ContentControl c = new ContentControl(); 
c.SetBinding (ContentControl.Content, new Binding()); 
c.DataContext = "Test"; 
object test = c.Content; 

À ce stade, c.Content renvoie null.

Existe-t-il un moyen de forcer l'évaluation de la liaison afin que c.Content retourne "Test"?

Répondre

6

Un seul message peut s'exécuter à la fois sur le thread de l'interface utilisateur, où ce code est exécuté. se produit à une priorité spécifique de liaison de données dans des messages séparés, vous devrez vous assurer que ce code:

object test = c.Content; 

court après les données des messages de liaison sont exécutés. Vous pouvez le faire en faire la queue un message séparé avec le même niveau de priorité (ou moins) comme liaison de données:

var c = new ContentControl(); 
c.SetBinding(ContentControl.ContentProperty, new Binding()); 
c.DataContext = "Test"; 

// this will execute after all other messages of higher priority have executed, and after already queued messages of the same priority have been executed 
Dispatcher.BeginInvoke((ThreadStart)delegate 
{ 
    object test = c.Content; 
}, System.Windows.Threading.DispatcherPriority.DataBind); 
+0

+1 Très belle idée de quelque chose que je ne connaissais pas, et signifiait que je devais donner sur un scénario de test unitaire que j'avais. Superbe. Et j'allais suggérer de définir le DataContext avant de configurer la liaison, ce dont je ne vais pas me préoccuper maintenant! :) –

+0

Encore mieux: c.Dispatcher.Invoke (nouveau ThreadStart (delegate {}), DispatcherPriority.Render); –

Questions connexes