Question

Im essayant de se lier à la sortie d'un procédé. Maintenant, je l'ai vu des exemples en utilisant ObjectDataProvider Cependant, le problème est ObjectDataProvider crée une nouvelle instance de l'objet pour appeler la méthode. Là où je besoin de la méthode appelée sur l'instance actuelle de l'objet. Je suis actuellement en essayant d'obtenir un convertisseur au travail.

Configuration:

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

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

Ma tentative de 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>

mon code derrière

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.");
}

Mon problème est que je ne peux pas semble passer l'entité actuelle dans le convertisseur. Alors, quand je tente de réflexion utiliser pour obtenir la méthode getProperty Je n'ai rien à opérer sur

merci, steph

Était-ce utile?

La solution

Emballez l'appel à la méthode dans une propriété get et ajoutez cette propriété get à quelque classe qui est votre DataContext actuelle.

Edit: mise à jour répondre à votre question.

Si vous ne passez un paramètre à l'valueconverter vous n'avez pas besoin multivalueconverter, il suffit d'utiliser une valueconverter régulière (mise en œuvre IValueConverter). En outre, pourquoi ne pas jeter l'objet dans le valueconverter à un Distionary et l'utiliser directement au lieu d'utiliser la réflexion.

Pour passer datacontext actuelle comme liant faire: <Binding . />. Je devine que la datacontext du TextBlock est l'entité.

Pourtant, tout cela n'est pas nécessaire si tout ce que vous voulez faire est d'exécuter un code avant d'accéder à un élément dictionnaire. Il suffit d'utiliser une propriété d'index à la place, vous pouvez directement à DataBind:

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]}" />
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top