Frage

Im Versuch mit dem Ausgang eines Verfahrens zu binden. Jetzt habe ich Beispiele für diese Verwendung ObjectDataProvider gesehen aber das Problem dabei ist, Object eine neue Instanz des Objekts erstellt die Methode aufzurufen. Wo muß ich die Methode auf der aktuellen Objektinstanz aufgerufen. Ich versuche zur Zeit einen Konverter zur Arbeit zu kommen.

Setup:

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

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

Mein Versuch am 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>

mein Code hinter

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

Mein Problem ist, dass ich kann nicht scheinen, die aktuelle Entity in den Konverter zu übergeben. Wenn ich also zu verwenden Reflexion versuchen, die getProperty Methode zu bekommen habe ich nichts zu operieren

Danke, steph

War es hilfreich?

Lösung

Wickeln Sie den Aufruf der Methode in einem get-Eigenschaft und fügen Sie diese Eigenschaft erhalten, was auch immer Klasse, die Ihren aktuellen Datacontext ist.

Edit: Wir beantworten Ihre Frage aktualisiert.

Wenn Sie nur einen Parameter an die Valueconverter passieren Sie kein multivalueconverter benötigen, verwenden Sie nur eine regelmäßige Valueconverter (implementierende IValueConverter). Auch, warum nicht das Objekt in dem Valueconverter zu einem Distionary gegossen und es verwendet, direkt anstatt mit Reflexion.

<Binding . />:

Um die aktuellen Datacontext als diese Bindung nicht passieren. Ich vermute, die Datacontext des Textblockes Einheit ist.

Doch all dies ist nicht erforderlich, wenn alles, was Sie tun möchten, ist einigen Code ausführen, bevor ein Wörterbuch Artikel zugreifen. Verwenden Sie einfach einen Index Eigenschaft stattdessen können Sie es Databind direkt:

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]}" />
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top