¿Cómo se vincula a un método de objetos en este escenario en 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>
Aquí quiero vincularme al GetChildren
método en cada uno RootObject
de los árboles.
EDITAR La vinculación a un ObjectDataProvider
no parece funcionar porque estoy vinculando a una lista de elementos, y ObjectDataProvider
necesita un método estático o crea su propia instancia y la usa.
Por ejemplo, usando la respuesta de Matt obtengo:
Error de System.Windows.Data: 33: ObjectDataProvider no puede crear el objeto; Escriba = 'RootObject'; Error = 'Parámetros incorrectos para el constructor'.
Error de System.Windows.Data: 34: ObjectDataProvider: Error al intentar invocar el método en el tipo; Método = 'GetChildren'; Escriba = 'RootObject'; Error = 'El miembro especificado no se puede invocar en el destino'. TargetException: 'System.Reflection.TargetException: El método no estático requiere un objetivo.
fuente
Respuestas:
Otro enfoque que podría funcionar para usted es crear una costumbre
IValueConverter
que tome un nombre de método como parámetro, de modo que se use así:Este convertidor buscaría e invocaría el método mediante la reflexión. Esto requiere que el método no tenga argumentos.
Aquí hay un ejemplo de la fuente de dicho convertidor:
Y una prueba unitaria correspondiente:
Tenga en cuenta que este convertidor no aplica el
targetType
parámetro.fuente
No estoy seguro de qué tan bien funcionará en su escenario, pero puede usar la
MethodName
propiedadObjectDataProvider
para que llame a un método específico (con parámetros específicos de ustedMethodParameters
propiedad) para recuperar sus datos.Aquí hay un fragmento tomado directamente de la página de MSDN:
Entonces eso es una
ObjectDataProvider
llamada a unConvertTemp
método en una instancia de unaTemperatureScale
clase, pasando dos parámetros (0
yTempType.Celsius
).fuente
¿Tienes que ceñirte al método?
¿Se puede vincular a una propiedad cuyo método es getter?
fuente
A menos que pueda agregar una propiedad para llamar al método (o crear una clase contenedora que agregue esa propiedad), la única forma que conozco es usando un ValueConverter.
fuente
ObjectDataProvider también tiene una propiedad ObjectInstance que se puede usar en lugar de ObjectType
fuente
Puedes usar
System.ComponentModel
para definir propiedades para un tipo de forma dinámica (no forman parte de los metadatos compilados). Utilicé este enfoque en WPF para habilitar la vinculación a un tipo que almacenaba sus valores en campos, ya que la vinculación a campos no es posible.Los tipos
ICustomTypeDescriptor
yTypeDescriptionProvider
pueden permitirle lograr lo que desea. Según este artículo :No he probado este enfoque por mí mismo, pero espero que sea útil en su caso.
fuente
Para enlazar al método de un objeto en su escenario de WPF, puede enlazar a una propiedad que devuelve un delegado.
fuente