Bonjour,
est-il possible de remonter au type de donnée via une instance de "Binding" ?
Je peux remonter au Nom (B.Path.Path), est il possible de récupérer la classe afin de récupérer le type de PropertyPath par réflexion ?
Merci
Bonjour,
est-il possible de remonter au type de donnée via une instance de "Binding" ?
Je peux remonter au Nom (B.Path.Path), est il possible de récupérer la classe afin de récupérer le type de PropertyPath par réflexion ?
Merci
Tu peux grâce à la classe BindingExpression. Suppossons que tu ais un TextBox dont la propriété Text est "bindée" à une la propriété Title de la classe Article par exemple.
Tu auras à faire comme suit
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 BindingExpression bindingExpresion = BindingOperations.GetBindingExpression(myTextBox, TextBox.TextProperty); Article article = bindingExpression.DataItem as Article;
Voilà tu peux jouer avec l'objet "bindé" à ton TextBox mais par contre je ne sais pas comment récupérer la propriété (Title dans notre cas) à laquelle est "bindée" la propriété Text de ton TextBox.
Désolé en fait c'est possible en récupérant l'objet Binding et non l'objet BindingExpression comme suit
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Binding binding = BindingOperations.GetBinding(myTextBox, TextBox.TextProperty); PropertyPath path = binding.Path;
Salut et merci pour ta réponse !
J'ai fait ceci qui est fonctionnel (pour un DataGrid):
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Binding B = ((Binding)this.DataGridColumn.Binding); String PropertyName = B.Path.Path; Binding Binding = BindingOperations.GetBinding(this.DataGrid, AdvancedDataGrid.ItemsSourceProperty); BindingExpression Expression = BindingOperations.GetBindingExpression(this.DataGrid, AdvancedDataGrid.ItemsSourceProperty); Type CollectionType = Expression.DataItem.GetType().GetProperty(Binding.Path.Path).PropertyType; Type DataType = CollectionType.GetGenericArguments()[0].GetProperty(PropertyName).PropertyType;
Si il y a plus simple, je suis preneur.
Merci
Il faut quand même faire gaffe avec le path vu que j'ai comme l'impression que tu veux récupérer de façon générique le nom de la propriété via le Path. Mais cependant le Path peut contenir autre chose que le nom d'une propriété.
D'après MSDN :
- Dans le cas le plus simple, la valeur de la propriété Path correspond au nom de la propriété de l'objet source à utiliser pour la liaison, comme Path=PropertyName.
- Les sous-propriétés d'une propriété peuvent être spécifiées par une syntaxe semblable à celle utilisée en C#. Par exemple, la clause Path=ShoppingCart.Order affecte à la liaison la valeur de la sous-propriété Order de l'objet ou la propriété ShoppingCart.
- Pour créer une liaison avec une propriété attachée, placez des parenthèses autour de la propriété attachée. Par exemple, pour créer une liaison avec la propriété attachée DockPanel.Dock, la syntaxe est Path=(DockPanel.Dock).
- Les indexeurs d'une propriété peuvent être spécifiés dans des crochets qui suivent le nom de la propriété où l'indexeur est appliqué. Par exemple, la clause Path=ShoppingCart[0] affecte à la liaison l'index qui correspond à la manière dont l'indexation interne de votre propriété gère la chaîne littérale "0". Plusieurs indexeurs sont également prises en charge.
- Vous pouvez combiner des indexeurs et des sous-propriétés dans une clause Path. Par exemple : Path=ShoppingCart.ShippingInfo[MailingAddress,Street].
- À l'intérieur des indexeurs peuvent figurer plusieurs paramètres d'indexeur séparés par des virgules (,). Vous pouvez spécifier le type de chaque paramètre à l'aide de parenthèses. Par exemple, vous pouvez avoir Path="[(sys:Int32)42,(sys:Int32)24]", où sys est mappé à l'espace de noms System.
- Lorsque la source est une vue de collection, l'élément actuel peut être spécifié avec une barre oblique (/). Par exemple, la clause Path=/ affecte à la liaison l'élément actuel dans la vue. Lorsque la source est une collection, cette syntaxe spécifie l'élément actuel de la vue de collection par défaut.
- Les noms de propriété et les barres obliques peuvent être combinés pour parcourir les propriétés qui constituent des collections. Par exemple, Path=/Offices/ManagerName spécifie l'élément actuel de la collection de sources, contenant une propriété Offices qui est également une collection. Son élément actuel est un objet qui contient une propriété ManagerName.
- Un Path incluant un point (.) peut également être utilisé pour effectuer une liaison vers la source actuelle. Par exemple, Text="{Binding}" est équivalent à Text="{Binding Path=.}".
ça donne un peu la migraine non ?
Oui j'avoue !
Dans ce projet la propriété ItemSource de mes DataGrid sera toujours bindé sur une ObservableCollection<X> d'un ViewModel, donc ça passera toujours. Je vais quand même faire les vérifications sur les Binding au cas ou !
Merci pour ton aide.
Partager