2017-11-08 6 views
-1

Bitte helfen Sie mir mit datengebundenen Eigenschaften überprüfen.FrameworkElement.GetBindingExpression gibt null für datengebundenes Element zurück

Ich mag würde zu überprüfen, wurde in XAML für bestimmte Eigenschaft verwendet Bindung oder nicht Also habe ich schreibe Code wie

var uielement = something as FrameworkElement; 
if (uielement != null) 
{ 
    var sizeBinding = new[] { FrameworkElement.WidthProperty, FrameworkElement.HeightProperty }.Select(_ => uielement.GetBindingExpression(_)).ToList(); 
    if (sizeBinding.Count(_ => _ != null) > 0) 
    { 
     Trace.WriteLine(string.Format("found {0} bindings", sizeBinding.Count())); 
    } 
} 

Ich habe dies mit Height auf XAML-Elemente überprüft und Width Eigenschaften gebunden der Datenkontext

<UserControl Width="{Binding Size.Width, Mode=TwoWay}" 
Height="{Binding Size.Height, Mode=TwoWay}" 
> ... </UserControl> 

dies sollte Rahmenelement Breite und Höhe Eigenschaften und lassen (unter Verwendung von GetBindingExpression Methode) tragen, daß auf diesen Eigenschaften angewendet Bindung wurde. Größe ist eine Eigenschaft des Datenkontextobjekts vom Typ System.Windows.Size.

C# -Code oben funktioniert gut für den XAML-Code. jedoch, wenn die Expression Bindung hat die simpliest Form, wie

<UserControl Width="{Binding Size.Width}" 
Height="{Binding Size.Height, Mode=TwoWay}" 
> ... </UserControl> 

dann sizeBinding hat erstes Element null (für Width) und Bindungsausdruck Instanz zur Höhe binden. Ich kann mit Modus = TwoWay für die Bindung leben, aber ich möchte wissen, warum Bindungsinstanz nicht erstellt wird, wenn Modus nicht auf den TwoWay festgelegt ist. Ich habe gedacht, dass dies der Fall ist, weil Ausdruck komplexer als nur Pfad sein muss. Allerdings habe ich versucht Width="{Binding Size.Width, Mode=OneWay}", aber GetBindingExpression gibt null für die Bindung wie folgt zurück. Ich habe versucht BindingOperations GetBinding * Methoden, aber sie verhalten sich genauso wie FrameworkElement.GetBindingExpression.

Die einzige Frage, die ich googelte, ist this one. Aber es ist nicht klar für mich

Antwort

2

Der Grund ist sicherlich, dass Sie explizit die Width Eigenschaft von UserControl setzen, nachdem die Bindung hergestellt wurde.

Doing entfernt so eine OneWay Bindung (d ersetzt sie durch eine andere local value), aber hält ein TwoWay anstelle Bindung (und aktualisiert seine Quelleigenschaft).

+0

Scheint, Sie haben Recht. Ich habe versucht, 'Uid' Eigenschaft zu binden und GetBindingEpression funktioniert. Allerdings habe ich nicht gefunden, wo Breite und Höhe explizit festgelegt sind. Kann von der wpf-Engine stammen, wenn die Steuerung gerendert wird. Danke für die Erklärung – oleksa