Pregunta

Im intentar unirse a la salida de un método. Ahora que he visto ejemplos de este uso de ObjectDataProvider Sin embargo, el problema con esto es ObjectDataProvider crea una nueva instancia del objeto para llamar al método. Donde necesito el método llamado en la instancia del objeto actual. Actualmente estoy tratando de conseguir un convertidor para el trabajo.

Configuración:

Class Entity
{
   private Dictionary<String, Object> properties;

   public object getProperty(string property)
  {
      //error checking and what not performed here
     return this.properties[property];
  }
}

Mi intento en el XAML

     <local:PropertyConverter x:Key="myPropertyConverter"/>
      <TextBlock Name="textBox2">
          <TextBlock.Text>
            <MultiBinding Converter="{StaticResource myPropertyConverter}"
                          ConverterParameter="Image" >
              <Binding Path="RelativeSource.Self" /> <!--this doesnt work-->
            </MultiBinding>
          </TextBlock.Text>
        </TextBlock>

mi código detrás

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
    string param = (string)parameter;
    var methodInfo = values[0].GetType().GetMethod("getProperty", new Type[0]);
    if (methodInfo == null)
        return null;
    return methodInfo.Invoke(values[0], new string[] { param });               
}

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
    throw new NotSupportedException("PropertyConverter can only be used for one way conversion.");
}

Mi problema es que me parece que no puede pasar la corriente Entidad en el convertidor. Así que cuando trato de utilizar la reflexión para obtener el método getProperty no tengo nada que operar en

Gracias, Steph

¿Fue útil?

Solución

Envuelva la llamada al método dentro de una propiedad get y añadir esta propiedad get a cualquier clase que es su DataContext actual.

Editar: Respondiendo a su pregunta actualizada.

Si pasa únicamente un parámetro al valueconverter que no es necesario un multivalueconverter, sólo tiene que utilizar un valueconverter regular (aplicación de IValueConverter). Además, ¿por qué no convertir el objeto en el valueconverter a un Distionary y utilizarlo directamente en lugar de utilizar la reflexión.

Para pasar DataContext actual como hacer esta unión: <Binding . />. Supongo que el DataContext del bloque de texto es entidad.

Sin embargo, todo esto no es necesario si lo que quieres hacer es ejecutar algún código antes de acceder a un elemento de diccionario. Sólo tiene que utilizar una propiedad index lugar, puede DataBind a él directamente:

public class Entity 
{ 
   private Dictionary<String, Object> properties; 

   public object this[string property]
   {
        get
        { 
            //error checking and what not performed here 
            return properties[property]; 
        }
    } 
} 

<TextBlock Text="{Binding Path=[Image]}" />
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top