Lier à une méthode dans WPF?

Comment vous liez à une méthode d’objects dans ce scénario dans WPF?

public class RootObject { public ssortingng Name { get; } public ObservableCollection GetChildren() {...} } public class ChildObject { public ssortingng Name { get; } } 

XAML:

           

Ici, je veux lier la méthode GetChildren sur chaque object RootObject de l’arborescence.

EDIT La liaison à un ObjectDataProvider ne semble pas fonctionner car je suis lié à une liste d’éléments et que ObjectDataProvider nécessite une méthode statique ou crée sa propre instance et l’utilise.

Par exemple, en utilisant la réponse de Matt, j’obtiens:

System.Windows.Data Error: 33: ObjectDataProvider ne peut pas créer d’object; Type = ‘RootObject’; Error = ‘Mauvais parameters pour le constructeur.’

System.Windows.Data Error: 34: ObjectDataProvider: échec lors de la tentative d’appel de la méthode sur le type; Method = ‘GetChildren’; Type = ‘RootObject’; 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.

    Une autre approche qui pourrait fonctionner pour vous consiste à créer un IValueConverter personnalisé IValueConverter un nom de méthode en tant que paramètre, de sorte qu’il soit utilisé comme ceci:

     ItemsSource="{Binding Converter={StaticResource MethodToValueConverter}, ConverterParameter='GetChildren'}" 

    Ce convertisseur trouverait et invoquerait la méthode en utilisant la reflection. Cela nécessite que la méthode n’ait aucun argument.

    Voici un exemple de la source d’un tel convertisseur:

     public sealed class MethodToValueConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var methodName = parameter as ssortingng; if (value==null || methodName==null) return value; var methodInfo = value.GetType().GetMethod(methodName, new Type[0]); if (methodInfo==null) return value; return methodInfo.Invoke(value, new object[0]); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotSupportedException("MethodToValueConverter can only be used for one way conversion."); } } 

    Et un test unitaire correspondant:

     [Test] public void Convert() { var converter = new MethodToValueConverter(); Assert.AreEqual("1234", converter.Convert(1234, typeof(ssortingng), "ToSsortingng", null)); Assert.AreEqual("ABCD", converter.Convert(" ABCD ", typeof(ssortingng), "Trim", null)); Assert.IsNull(converter.Convert(null, typeof(ssortingng), "ToSsortingng", null)); Assert.AreEqual("Pineapple", converter.Convert("Pineapple", typeof(ssortingng), "InvalidMethodName", null)); } 

    Notez que ce convertisseur n’applique pas le paramètre targetType .

    Vous ne savez pas comment cela fonctionnera dans votre scénario, mais vous pouvez utiliser la propriété MethodName sur ObjectDataProvider pour qu’elle appelle une méthode spécifique (avec des parameters spécifiques si vous avez la propriété MethodParameters) pour récupérer ses données.

    Voici un extrait tiré directement de la page MSDN:

        0 Celsius    

    Donc, c’est un ObjectDataProvider qui appelle une méthode “ConvertTemp” sur une instance d’une classe “TemperatureScale”, en passant deux parameters (0 et TempType.Celsius ).

    Devez-vous vous lier à la méthode?

    Pouvez-vous vous connecter à une propriété qui est getter est la méthode?

     public ObservableCollection Children { get { return GetChildren(); } } 

    Sauf si vous pouvez append 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 consiste à utiliser un ValueConverter.

    ObjectDataProvider a également une propriété ObjectInstance qui peut être utilisée à la place de ObjectType

    Vous pouvez utiliser System.ComponentModel pour définir dynamicment 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 est impossible.

    Les types ICustomTypeDescriptor et TypeDescriptionProvider peuvent vous permettre d’obtenir ce que vous voulez. Selon cet article :

    TypeDescriptionProvider vous permet d’écrire une classe distincte qui implémente ICustomTypeDescriptor , puis d’enregistrer cette classe en tant que fournisseur de descriptions pour d’autres types.

    Je n’ai pas essayé cette approche moi-même, mais j’espère que c’est utile dans votre cas.

    Pour créer une liaison avec la méthode d’un object dans votre scénario WPF, vous pouvez créer une liaison avec une propriété qui renvoie un délégué.