Domanda

Im il tentativo di associarsi con l'uscita di un metodo. Ora ho visto esempi di questo utilizzo ObjectDataProvider Tuttavia il problema con questo è ObjectDataProvider crea una nuova istanza dell'oggetto per chiamare il metodo. Dove ho bisogno del metodo chiamato sulla istanza dell'oggetto corrente. Attualmente sto cercando di ottenere un convertitore per il lavoro.

Configurazione:

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

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

Il mio tentativo di 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>

il mio codice dietro

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

Il mio problema è che non posso sembrano passare la corrente Entità nel convertitore. Così, quando si tenta di utilizzare la riflessione per ottenere il metodo getProperty non ho nulla da operare su

grazie, Steph

È stato utile?

Soluzione

Avvolgere la chiamata al metodo all'interno di una proprietà get e aggiungere questa proprietà get a qualsiasi classe che è il vostro DataContext corrente.

Modifica: rispondere alla tua domanda aggiornato.

Se si passa un solo parametro alla ValueConverter non hai bisogno di un multivalueconverter, basta usare un ValueConverter regolare (attuazione IValueConverter). Inoltre, perché non il cast dell'oggetto in ValueConverter ad un Distionary e utilizzarlo direttamente invece di usare riflessione.

Per passare DataContext corrente come fare questo legame: <Binding . />. Sto indovinando il DataContext del blocco di testo è soggetto.

Eppure, tutto questo non è necessario se tutto quello che volete fare è eseguire un certo codice prima di accedere a una voce di dizionario. Basta usare una proprietà index, invece, è possibile DataBind ad esso direttamente:

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]}" />
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top