Ich versuche, ein Objekt sofort nach dem Ändern des DataContext zu messen, aber die Bindung für das Objekt wird nicht bald genug aktualisiert. Hier ist mein Code:
%Vor%Ich möchte, dass die Bindungen für das View-Objekt aktualisiert werden, damit ich messen kann, wie groß die View sein muss, um das ViewModel anzuzeigen. Ich verwende dieselbe Ansicht erneut, um zu messen, da ich die Daten virtualisiere.
Kann jemand die Bindung erzwingen, um zu aktualisieren, wenn sich der DataContext ändert?
Beachten Sie, dass die Bindung schließlich aktualisiert wird.
Die Ansicht enthält einen TextBlock, der das Hauptelement ist, das basierend auf dem ViewModel die Größe ändert. Ich habe die BindingExpression für die TextProperty für dieses Element unmittelbar nach dem Ändern des DataContext untersucht, aber das Aufrufen von UpdateTarget () behebt das Problem nicht, und BindingExpression.DataItem scheint null zu sein.
BEARBEITEN: Der Status der BindingExpression ist nicht verknüpft. Der Trick besteht darin, herauszufinden, wie man es anhängt.
Nun, wenn Sie nach dem Setzen des DataContext einen Invoke auf dem Dispatcher mit der DataBind-Priorität durchgeführt haben, sollte dies dazu führen, dass alle aktualisiert werden.
Da dieser Code innerhalb der MeasureOverride-Methode ausgeführt wird, können Sie keine Invoke für den Dispatcher ausführen. Stattdessen würde ich ein Flag erstellen, das angibt, ob die Linealbreite gemessen wurde, und falls nicht, ein BeginInvoke für die Methode, mit der diese Breiten berechnet werden. Wenn die Breiten berechnet sind, rufen Sie InvalidateMeasure auf, um einen zweiten Layoutdurchlauf zu erzwingen.
Dies erfordert jedes Mal, wenn sich eine dieser Breiten ändert, einen zusätzlichen Layout-Durchlauf. Sie müssen das Flag auf "false" zurücksetzen, wenn die Textfelder erneut gemessen werden müssen.
%Vor%Tags und Links wpf .net c# data-binding