Vincular a um método no WPF?

Como você se vincula a um método de objects neste cenário no WPF?

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

XAML:

           

Aqui eu quero ligar ao método GetChildren em cada RootObject da tree.

EDIT Binding to an ObjectDataProvider parece não funcionar porque estou vinculando a uma lista de itens, e o ObjectDataProvider precisa de um método estático ou cria sua própria instância e usa isso.

Por exemplo, usando a resposta de Matt eu recebo:

Erro System.Windows.Data: 33: ObjectDataProvider não é possível criar object; Type = ‘RootObject’; Erro = ‘parameters incorretos para o construtor’.

Erro System.Windows.Data: 34: ObjectDataProvider: Falha ao tentar invocar o método no tipo; Método = ‘GetChildren’; Type = ‘RootObject’; Erro = ‘O membro especificado não pode ser chamado no destino.’ TargetException: ‘System.Reflection.TargetException: método não estático requer um destino.

    Outra abordagem que pode funcionar para você é criar um IValueConverter personalizado que IValueConverter um nome de método como parâmetro, para que seja usado assim:

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

    Este conversor encontraria e invocaria o método usando reflection. Isso requer o método para não ter argumentos.

    Aqui está um exemplo da fonte de um conversor:

     public sealed class MethodToValueConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var methodName = parameter as string; 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."); } } 

    E um teste unitário correspondente:

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

    Observe que este conversor não impõe o parâmetro targetType .

    Não tenho certeza de quão bem ele funcionará no seu cenário, mas você pode usar a propriedade MethodName em ObjectDataProvider para que ele chame um método específico (com parâmetros específicos se você tiver a propriedade MethodParameters) para recuperar seus dados.

    Aqui está um trecho retirado diretamente da página do MSDN:

        0 Celsius    

    Então esse é um ObjectDataProvider que está chamando um método “ConvertTemp” em uma instância de uma class “TemperatureScale”, passando dois parâmetros (0 e TempType.Celsius ).

    Você tem que se ligar ao método?

    Você pode ligar a uma propriedade que é getter o método?

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

    A menos que você possa adicionar uma propriedade para chamar o método (ou criar uma class de invólucro que inclua essa propriedade), a única maneira que conheço é usar um ValueConverter.

    ObjectDataProvider também tem uma propriedade ObjectInstance que pode ser usada em vez de ObjectType

    Você pode usar System.ComponentModel para definir propriedades para um tipo dinamicamente (elas não fazem parte dos metadados compilados). Eu usei essa abordagem no WPF para ativar a binding a um tipo que armazenou seus valores em campos, como a binding a campos não é possível.

    Os tipos ICustomTypeDescriptor e TypeDescriptionProvider podem permitir que você atinja o que deseja. De acordo com este artigo :

    TypeDescriptionProvider permite que você escreva uma class separada que implementa ICustomTypeDescriptor e, em seguida, registre essa class como o provedor de descrições para outros tipos.

    Eu mesmo não tentei essa abordagem, mas espero que seja útil no seu caso.

    Para vincular ao método de um object em seu cenário WPF, você pode vincular a uma propriedade que retorna um delegado.