2017-07-27 13 views
1

Dans Silverlight (et d'autres technologies basées sur XAML), il existe une méthode appelée GetBindingExpression qui permet de vérifier la liaison sur une propriété de dépendance donnée. La méthode est sur FrameworkElement, de sorte que chaque contrôle unique nous donne accès à l'expression de liaison.Xamarin Forms - GetBindingExpression

Par exemple:

var selectedItemBindingExpression = GetBindingExpression(SelectedItemProperty); 

Mais, il ne semble pas être un équivalent dans les formes Xamarin. Existe-t-il un moyen d'obtenir une expression de liaison à partir d'une propriété BindableProperty dans Xamarin Forms?

Répondre

4

Je ne crois pas qu'il existe des API publiques disponibles dans Xamarin.Forms pour accéder à la BindingExpression - mais vous pouvez utiliser la réflexion pour accéder au associé Binding et donc la BindingExpression

public static class BindingObjectExtensions 
{ 
    public static Binding GetBinding(this BindableObject self, BindableProperty property) 
    { 
     var methodInfo = typeof(BindableObject).GetTypeInfo().GetDeclaredMethod("GetContext"); 
     var context = methodInfo?.Invoke(self, new[] { property }); 

     var propertyInfo = context?.GetType().GetTypeInfo().GetDeclaredField("Binding"); 
     return propertyInfo?.GetValue(context) as Binding; 
    } 

    public static object GetBindingExpression(this Binding self) 
    { 
     var fieldInfo = self?.GetType().GetTypeInfo().GetDeclaredField("_expression"); 
     return fieldInfo?.GetValue(self); 
    } 
} 

Exemple d'utilisation - Get liant -expression

var expr = this.GetBinding(TextProperty).GetBindingExpression(); 

Exemple d'utilisation - obtenir le chemin de liaison (mise à jour 07/27)

//to access path - you can directly use the binding object 
var binding = this.GetBinding(TextProperty); 
var path = binding?.Path; 
+0

Excellent. J'ai déjà fait ce genre de chose. L'équipe de Xamarin nous cache des trucs sans raison. –

+0

Va tester ça. –

+1

Peut-être ajouter un peu pour expliquer comment obtenir le BindableProperty? Pour tous ceux qui cherchent, c'est à partir de l'entrée statique comme _associatedObject.GetBinding (Entry.TextProperty) – Andrey