none
DP Wert und Metadata RRS feed

  • Frage

  • Hallo!

    Ich dachte, ich bin mit DP's durch ...    :-))

    Ich habe in einem UserControl drei "Identische" (nur Namen anders) DP's vom Typ String:

    // Etage_Neu_String
    private static readonly DependencyProperty Etage_Neu_StringProperty = DependencyProperty.Register("Etage_Neu_String", typeof(string), typeof(LageView), new PropertyMetadata("A"));
    public string Etage_Neu_String
    {
        get { return (string)GetValue(Etage_Neu_StringProperty); }
        set { SetValue(Etage_Neu_StringProperty, value); }
    }
    
    // GES_Lage - GES-Lage-Kennzeichen
    private static readonly DependencyProperty GES_LageProperty = DependencyProperty.Register("GES_Lage", typeof(string), typeof(LageView), new PropertyMetadata("AAA"));
    public string GES_Lage
    {
        get { return (string)GetValue(GES_LageProperty); }
        set { SetValue(GES_LageProperty, value); }
    }
    
    // zLage - GES-Lage-Kennzeichen
    private static readonly DependencyProperty zLageProperty = DependencyProperty.Register("zLage", typeof(string), typeof(LageView), new PropertyMetadata("AA"));
    public string zLage
    {
        get { return (string)GetValue(zLageProperty); }
        set { SetValue(zLageProperty, value); }
    }

    Zur Kontrolle, lasse ich mir die Werte der DP's in meiner Applikation anzeigen:

    <TextBlock Text="{Binding ElementName=lv1, Path=Etage_Neu_String, UpdateSourceTrigger=PropertyChanged, Mode=OneWay , StringFormat={} Etage_Neu_String: {0}}" Margin="0,15" />
    <TextBlock Text="{Binding ElementName=lv1, Path=GES_Lage, UpdateSourceTrigger=PropertyChanged, Mode=OneWay , StringFormat={} GES_Lage: {0}}" Margin="0,30" />
    <TextBlock Text="{Binding ElementName=lv1, Path=zLage, UpdateSourceTrigger=PropertyChanged, Mode=OneWay , StringFormat={} zLage: {0}}" Margin="0,45" />

    In meinem UserControl greife ich in der PropertyChangedCallback Methode eines anderen DP's (nEtagen) auf die drei DP's zu und lasse mir die Werte der DP's anzeigen:

    Etage ucNewEtage = new Etage();                                             // Neue Etage instanzieren
    ...
    // Sonstige Eigenschaften der Etage initalisieren
    ucNewEtage.Bezeichnung = ucLageView.Etage_Neu_String + " | " + ucLageView.GES_Lage + " | " + ucLageView.zLage ;            // Bezeichnung der Etage eintragen
    ...

    Das Ergebnis ist nun folgendes:

    In der Applikation sind einheitlich nur die Metadaten der DP's verfügbar. (Das Binding GES_Lage hat plötzlich auch nur die Metadaten.)

    Im VS teilweise auch die übergebenen DP-Werte (Etage_Neu_String):

    wobei hier wieder auch mal die Metadaten im Binding (oben: GES_Lage) angezeigt werden.

    Wie kann ich denn in der PropertyChangedCallback Methode auf die Werte der DP's zugreifen????

    Bzw. was ist den die Ursache für dieses Chaos?


    • Bearbeitet perlfred Donnerstag, 18. August 2016 06:45
    Donnerstag, 18. August 2016 06:40

Antworten

  • Hallo Fred,

    weil ich es schon hatte, habe ich das UserControl2 aus der vorherigen Diskussion genommen und die drei DPs dort neben der Breite hinzugefügt; wobei ich über das Parent Window die Standardwerte abgeändert habe.

    Wenn ich der setEtagen Methode (aus Deiner Version), die bei der Änderung der nEtagen ausgelöst wird einfüge:

            private static void setEtagen(int etagen, UserControl2 uc2)
            {
                Console.WriteLine($"Etage Neu: {uc2.Etage_Neu_String}, Lage:{uc2.GES_Lage} zLage: {uc2.zLage}");
                // ... Anlage ausgelassen
             }

    so erhalten ich beim ersten Aufruf die initialen Werte ("A", "AA", "AAA"), dann bei jeder Änderung die gesetzten aus dem Parent Window. Das ist logisch, denn es ergibt sich aus der Reihenfolge, in der die Eigenschaften gesetzt werden; bei mir exemplarisch:

    <local:UserControl2 x:Name="UserControl2" Etagen="2" BreiteSP1="150" zLage="0201" Etage_Neu_String="ABC" GES_Lage="CDE" />

    Tauscht man die Plätze und stellt Etagen (bei Dir nEtagen) nach hinten, so kriegt man bereits die aktualisierten Werte.

    Gruß Elmar
    • Als Antwort markiert perlfred Donnerstag, 18. August 2016 11:44
    Donnerstag, 18. August 2016 10:29

Alle Antworten

  • Hallo Fred,

    weil ich es schon hatte, habe ich das UserControl2 aus der vorherigen Diskussion genommen und die drei DPs dort neben der Breite hinzugefügt; wobei ich über das Parent Window die Standardwerte abgeändert habe.

    Wenn ich der setEtagen Methode (aus Deiner Version), die bei der Änderung der nEtagen ausgelöst wird einfüge:

            private static void setEtagen(int etagen, UserControl2 uc2)
            {
                Console.WriteLine($"Etage Neu: {uc2.Etage_Neu_String}, Lage:{uc2.GES_Lage} zLage: {uc2.zLage}");
                // ... Anlage ausgelassen
             }

    so erhalten ich beim ersten Aufruf die initialen Werte ("A", "AA", "AAA"), dann bei jeder Änderung die gesetzten aus dem Parent Window. Das ist logisch, denn es ergibt sich aus der Reihenfolge, in der die Eigenschaften gesetzt werden; bei mir exemplarisch:

    <local:UserControl2 x:Name="UserControl2" Etagen="2" BreiteSP1="150" zLage="0201" Etage_Neu_String="ABC" GES_Lage="CDE" />

    Tauscht man die Plätze und stellt Etagen (bei Dir nEtagen) nach hinten, so kriegt man bereits die aktualisierten Werte.

    Gruß Elmar
    • Als Antwort markiert perlfred Donnerstag, 18. August 2016 11:44
    Donnerstag, 18. August 2016 10:29
  • Hallo Elmar!

    Na das ist ja ganz, ganz Stark !!!

    Die Reihenfolge der DP's im UserControl hatte ich auch schon einmal geändert, aber das die Reihenfolge der Parameter des Instanzaufrufes Einfluss auf die Reihenfolge der Instanzierung der DP's hat, darauf wäre ich nie gekommen! Für mich werden die Parameter bei der Instanzierung alle mit einmal übergeben und dann hätte maximal die Reihenfolge der Deklaration der DP's Einfluss auf die Reihenfolge der Instanzierung der DP's.

    Das ist logisch, denn es ergibt sich aus der Reihenfolge, in der die Eigenschaften gesetzt werden -> Ja! und ??? :-))

    Jede Eigenschaft wird also einzeln gesetzt. Da habe ich mal wieder etwas grundsätzliches gelernt.

    Vielen, vielen Dank, sooo macht Programmierung richtig Spaß!

    Da kann ich mir das sparen ....

                  _
                 |  |
                 |  |===( ) //////
                 |_|     ||| | o o |
                          ||| (  c   )                ___
                          |||  \ = /                 ||   \_
                          ||||||                        ||     |
                          ||||||                        ||__/|
                          ||||||              __|_______ |__
                            |||             |______________|
                            |||             ||   ||             || ||
                            |||             ||   ||             || ||
    ----------------|||---------||--||---------||-||-------
                            |__>         ||   ||             || ||







    • Bearbeitet perlfred Donnerstag, 18. August 2016 12:22
    Donnerstag, 18. August 2016 12:18