Como você vincula a um método de objetos neste cenário no 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>
Aqui, desejo vincular ao GetChildren
método em cada uma RootObject
das árvores.
EDITAR Vincular a um ObjectDataProvider
não parece funcionar porque estou vinculando a uma lista de itens e 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, recebo:
Erro System.Windows.Data: 33: ObjectDataProvider não pode criar objeto; Tipo = 'RootObject'; Erro = 'Parâmetros errados para o construtor.'
Erro System.Windows.Data: 34: ObjectDataProvider: falha ao tentar invocar o método no tipo; Método = 'GetChildren'; Tipo = 'RootObject'; Erro = 'O membro especificado não pode ser chamado no destino.' TargetException: 'System.Reflection.TargetException: O método não estático requer um destino.
fonte
Respostas:
Outra abordagem que pode funcionar para você é criar um personalizado
IValueConverter
que tenha um nome de método como parâmetro, de modo que seja usado assim:Este conversor iria encontrar e invocar o método usando reflexão. Isso requer que o método não tenha argumentos.
Aqui está um exemplo de fonte de tal conversor:
E um teste de unidade correspondente:
Observe que este conversor não impõe o
targetType
parâmetro.fonte
Não tenho certeza se funcionará bem em seu cenário, mas você pode usar a
MethodName
propriedade onObjectDataProvider
para que ele chame um método específico (com parâmetros específicos de suaMethodParameters
propriedade) para recuperar seus dados.Aqui está um snippet retirado diretamente da página do MSDN:
Então,
ObjectDataProvider
isso está chamando umConvertTemp
método em uma instância de umaTemperatureScale
classe, passando dois parâmetros (0
eTempType.Celsius
).fonte
Você tem que se vincular ao método?
Você pode vincular a uma propriedade cujo método é getter?
fonte
A menos que você possa adicionar uma propriedade para chamar o método (ou criar uma classe de wrapper que adiciona essa propriedade), a única maneira que conheço é usando um ValueConverter.
fonte
ObjectDataProvider também tem uma propriedade ObjectInstance que pode ser usada em vez de ObjectType
fonte
Você pode usar
System.ComponentModel
para definir propriedades para um tipo dinamicamente (eles não fazem parte dos metadados compilados). Usei essa abordagem no WPF para permitir a vinculação a um tipo que armazenava seus valores em campos, já que a vinculação a campos não é possível.Os tipos
ICustomTypeDescriptor
eTypeDescriptionProvider
podem permitir que você alcance o que deseja. De acordo com este artigo :Eu não tentei essa abordagem, mas espero que seja útil no seu caso.
fonte
Para vincular ao método de um objeto em seu cenário WPF, você pode vincular a uma propriedade que retorna um delegado.
fonte