Comment liez-vous à une méthode d'objets dans ce scénario dans WPF?
public class RootObject
{
public string Name { get; }
public ObservableCollection<ChildObject> GetChildren() {...}
}
public class ChildObject
{
public string Name { get; }
}
XAML:
<TreeView ItemsSource="some list of RootObjects">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type data:RootObject}"
ItemsSource="???">
<TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type data:ChildObject}">
<TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
Ici, je veux me lier à la GetChildren
méthode sur chacun RootObject
des arbres.
EDIT La liaison à un ObjectDataProvider
ne semble pas fonctionner parce que je me lie à une liste d'éléments et que les ObjectDataProvider
besoins soit une méthode statique, soit elle crée sa propre instance et l'utilise.
Par exemple, en utilisant la réponse de Matt, j'obtiens:
Erreur System.Windows.Data: 33: ObjectDataProvider ne peut pas créer d'objet; Type = 'objet racine'; Error = 'Mauvais paramètres pour le constructeur.'
Erreur System.Windows.Data: 34: ObjectDataProvider: échec de la tentative d'appel de la méthode sur le type; Méthode = 'GetChildren'; Type = 'objet racine'; Error = 'Le membre spécifié ne peut pas être appelé sur la cible.' TargetException: 'System.Reflection.TargetException: La méthode non statique nécessite une cible.
la source
Réponses:
Une autre approche qui pourrait fonctionner pour vous est de créer une personnalisation
IValueConverter
qui prend un nom de méthode en tant que paramètre, afin qu'elle soit utilisée comme ceci:Ce convertisseur trouverait et invoquerait la méthode en utilisant la réflexion. Cela nécessite que la méthode n'ait aucun argument.
Voici un exemple de la source d'un tel convertisseur:
Et un test unitaire correspondant:
Notez que ce convertisseur n'applique pas le
targetType
paramètre.la source
Vous ne savez pas comment cela fonctionnera dans votre scénario, mais vous pouvez utiliser la
MethodName
propriété surObjectDataProvider
pour lui faire appeler une méthode spécifique (avec des paramètres spécifiques de votreMethodParameters
propriété) pour récupérer ses données.Voici un extrait de code extrait directement de la page MSDN:
C'est donc
ObjectDataProvider
uneConvertTemp
méthode qui appelle une méthode sur une instance d'uneTemperatureScale
classe, en passant deux paramètres (0
etTempType.Celsius
).la source
Devez-vous vous lier à la méthode?
Pouvez-vous vous lier à une propriété dont le getter est la méthode?
la source
À moins que vous ne puissiez ajouter une propriété pour appeler la méthode (ou créer une classe wrapper qui ajoute cette propriété), le seul moyen que je connaisse est d'utiliser un ValueConverter.
la source
ObjectDataProvider a également une propriété ObjectInstance qui peut être utilisée à la place de ObjectType
la source
Vous pouvez utiliser
System.ComponentModel
pour définir dynamiquement les propriétés d'un type (elles ne font pas partie des métadonnées compilées). J'ai utilisé cette approche dans WPF pour activer la liaison à un type qui stockait ses valeurs dans des champs, car la liaison aux champs n'est pas possible.Les types
ICustomTypeDescriptor
etTypeDescriptionProvider
peuvent vous permettre d'obtenir ce que vous voulez. D'après cet article :Je n'ai pas essayé cette approche moi-même, mais j'espère qu'elle vous sera utile dans votre cas.
la source
Pour lier à la méthode d'un objet dans votre scénario WPF, vous pouvez lier à une propriété qui retourne un délégué.
la source