none
Binding mit flexiblen Properties oder Parameterübergabe RRS feed

  • Frage

  • Hallo Group,

    inzwischen habe ich mich in MVVM und MVVM Light etwas eingearbeitet, aber hänge jetzt.
    Wie ich ein Property in XAML binden kann, ist mir klar.
    z.B. so:

    <Label Text="{Binding mod.myProperty}" FontSize="28" VerticalOptions="Center" HorizontalOptions="Center" />

    Ich benötige aber ein Binding mit flexiblen Propertynamen.
    Daher gehe ich davon aus, dass ich eine Funktion mit Übergabeparameter dafür brauche, da das bei einer Property nicht möglich ist.
    z.B. so (was aber natürlich nicht funktioniert)

    <Label Text="{Binding mod.myParamValue("OS")}" FontSize="28" VerticalOptions="Center" HorizontalOptions="Center" />
     <Label Text="{Binding mod.myParamValue("USER")}" FontSize="28" VerticalOptions="Center" HorizontalOptions="Center" />

    Die Funktion dazu könnte so aussehen

    public class myModel : ObservableObject
      {
    	public String myParamValue(string Parameter)
            {
                switch (Parameter)
                {
                    case "OS":
                        return "Win 10";
    
                    case "USER":
                        return "Klaus Bärbel";
    
                    default:
                        return "Parameter unbekannt.";
                }
            }
      }
    Wie müsste man da rangehen?
     Ich habe mir schon den "Wolf" gesucht und nichts gefunden was mir weiterhilft.

    Freitag, 23. September 2016 13:51

Antworten

Alle Antworten

  • Hallo,

    generell soll ein ViewModel gerade solche Handstände vermeiden, d. h. die gebundenen Werte werden als konkrete Eigenschaften implementiert.

    Wenn es unbedingt "dynamisch" sein muss, so implementiere einen Value Converter und übergebe ihm den jeweiligen ConverterParameter, einige Beispiele findet man u. a. in:

    Gewusst wie: Erzeugen eines Werts auf Grundlage einer Liste gebundener Elemente,

    How to pass specific value to the converter parameter?.

    Gruß Elmar

    • Als Antwort markiert iwrschenk Dienstag, 27. September 2016 06:48
    Freitag, 23. September 2016 14:56
  • Hallo,

    warum willst Du deine Logik mittels Properties und Parametern aufweichen?
    Das Model ist es. Passe den Inhalt - die Properties deines Models, aufgrund deiner Wünsche an.
    Merke Dir in deinem Model den Inhalt von deinem Parameter ("OS","USER",....)
    und reagiere in deinem Model. Dein Model sollte INotifyPropertyChanged Implemtieren.
    Dein String myParamValue sollte  PropertyChanged aufrufen damit deine Oberfläche das mitbekommt.
    HTH

    Grüße Alexander 

    Freitag, 23. September 2016 15:03
  • Hallo Elmar,

    Danke für die Rückmeldung.

    Ich glaube ich habe mein Beispiel zu stark vereinfacht, so dass die Problemstellung nicht klar geworden ist.

    Die Variablennamen sollen dynamisch sein bzw. werden erst zur Laufzeit erzeugt.
    Es wird daher im Model kein Switch mit bekannten Variablen geben.
    Ich nehme an, ich werde statt dessen eine Dictionary nehmen.
    Und bei diesem Gedanke merke ich, dass meine Frage lauten müsste 'Wie kann man Einträge einer Dictionary binden'.

    Ich google mal danach. Wahrscheinlich findet man mit dieser Fragestellung eher was.

    Gruß Achim

    Dienstag, 27. September 2016 06:47
  • Danke Alexander.

    Siehe meine Antwort oben bei Elmar.

    Gruß Achim

    Dienstag, 27. September 2016 06:48
  • Hi Achim,
    ein Element eines Wörterbuches kann man nicht direkt binden.

    Beispielsweise kann der ViewModel in einem Member (z.B. eine Eigenschaft) das Wörterbuch liefern. Zusätzlich wird in der Bindung ein Converter mit ConverterParameter genutzt. Der Converter liefert dann das Element aus dem Wörterbuch aufbereitet für einen Anzeige. Auch der umgekehrte Weg (Daten in der Oberfläche verändern) ist damit möglich.


    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks
    Warum Groß- und Kleinschreibung wichtig ist:
    Der Gefangene floh.
    Der gefangene Floh.

    Dienstag, 27. September 2016 09:57