none
Binding geht nicht RRS feed

  • Frage

  • Ich hab keine Idee.

               <StackPanel Orientation ="Vertical" Margin="15">
                    <TextBlock Text="{x:Bind ViewModel.Entries_Current_Navigation_Path, Mode=OneWay}"
                           Margin="2" FontSize="12" FontWeight="ExtraLight"/>
    
                    <TextBlock Text="{x:Bind ViewModel.Entries_Current_List_Entry_Navigated_From.Title, Mode=OneWay}" 
                           Margin="2" FontSize="22" FontWeight="ExtraLight"/>
    

    Also den oberen TextBlock  gestern eingefügt. Nach dem Visual Studio Update 15.5.7. Der String wird nicht
    angezeigt. Der untere TextBlock ist älter und wird korrekt angezeigt und upgedatet. Beide Werte im ViewModel sind korrekt belegt.

    Im Debug sieht man das der Property Get für den unteren TextBlock im Bedarfsfall also beim Navigieren aufgerufen wird der Property Get für den oberen eingefügten TextBlock am Programmstart einmal und dann nicht mehr.

    Also im Programmcode ist die Syntax wohl korrekt?

    Was kann das sein?

    Donnerstag, 22. Februar 2018 08:49

Antworten

  • Rufst Du den auch nach dem ändern des neunen Wertes im Code PropertyChanged auf? So in der Art

    public class MainViewModel : INotifyPropertyChanged
    {
        string _name = string.Empty;
        public string Name { get { return _name; } set { _name = value; OnPropertyChanged(); } }
    
        public event PropertyChangedEventHandler PropertyChanged = delegate { };
        public void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            // Raise the PropertyChanged event, passing the name of the property whose value has changed.
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }


    Gruß Thomas
    Sage nie, ich kann es nicht - sage nur, ich kann es noch nicht!
    Dev Apps von mir: Icon für UWP,  UI Strings
    Andere Dev Apps: UWP Community Toolkit Sample App

    • Als Antwort markiert Markus222 Donnerstag, 22. Februar 2018 14:06
    Donnerstag, 22. Februar 2018 12:24

Alle Antworten

  • Hallo Markus,

    hast Du die üblichen verdächtigen schon gelöscht (Ordner bin, obj)? Kannst Du das Problem in einem neuen Projekt nachstellen? Wenn ja stelle das mal zum download zur Verfügung.


    Gruß Thomas
    Sage nie, ich kann es nicht - sage nur, ich kann es noch nicht!
    Dev Apps von mir: Icon für UWP,  UI Strings
    Andere Dev Apps: UWP Community Toolkit Sample App

    Donnerstag, 22. Februar 2018 09:03
  • Ja, bin und obj gestern und heute gelöscht. Es half nichts.

    Es ist etwas komisches. Also ich programmiere nur ab und zu. Es ist ein Programm für private Daten. Ich benutze es ja kaum..

    Also wenn ich einen neuen Eintrag mache geht es.

    Aber nur dann.

    Wenn ich dann navigiere wird der dem Binding liegende Pfad korrekt angepasst aber halt nicht angezeigt :-)

    Unten die Termine sind ganz woanders drin aber oben wird nicht mehr verändert. Nur dann wenn ich einen neuen Eintrag erfasse.

    Donnerstag, 22. Februar 2018 09:29
  • Die Termine sind in Start. Ein neuer Eintrag. Also es ist eine Art Baum Struktur mit Sachen die ich an jeder Stelle hinzufügen kann. Gewollt war das das Objekte von halt beliebigen Klassen sein sollen. Wollte den Navigationspfad einfügen. Aber nach dem Update geht die Anzeige des Binding nur dann richtig wenn ich einen neuen Eintrag erfasse. Im Code selber wird aber der String auch bei alten Einträgen korrekt gesetzt. Irgendwie wird beim Erfassen etwas aufgerufen was das wohl bewirkt. Aber der String ist stets korrekt angepasst.

    Donnerstag, 22. Februar 2018 09:43
  • Wenn das Binding grundsätzlich funktioniert, kann es nur an deinem Code liegen. Ohne den Code zu kennen, kann man da auch nicht viel zu sagen. Du solltest erstmal schauen was einen neuen Datensatz von einem alten unterscheidet. Vielleicht hast Du vor kurzem auch das Datenmodel verändert?


    Gruß Thomas
    Sage nie, ich kann es nicht - sage nur, ich kann es noch nicht!
    Dev Apps von mir: Icon für UWP,  UI Strings
    Andere Dev Apps: UWP Community Toolkit Sample App

    Donnerstag, 22. Februar 2018 11:59
  • Beim Erfassen wird eine neuen Page geladen. Die Objektinstanz der alten Page verschwindet. Beim Zurücknavigieren wird die
    Page in der das XAML definiert ist neu erzeugt und das PageLoaded Event aufgerufen.

    Das Binding des ersten TextBlocks der nach dem aktuellen VisualStudio Update eingefügt wurde wird also nur upgedatet wenn die Objektinstanz neu erzeugt wird.
    Nur einmal also.

    Das Binding des zweiten TextBlocks der vor dem aktuellen VisualStudio Update eingefügt wurde und schon älter ist wird upgedatet wenn sich der Wert ändert.

    Beide Werte im ViewModel werden richtig gesetzt und beim Navigieren angepasst.

    Ich weiß nicht ob es ein Fehler in Visual Studio ist und wie man das beheben soll? Jedenfalls kann man so nicht weitermachen.


    • Bearbeitet Markus222 Donnerstag, 22. Februar 2018 12:02
    Donnerstag, 22. Februar 2018 12:01
  • Rufst Du den auch nach dem ändern des neunen Wertes im Code PropertyChanged auf? So in der Art

    public class MainViewModel : INotifyPropertyChanged
    {
        string _name = string.Empty;
        public string Name { get { return _name; } set { _name = value; OnPropertyChanged(); } }
    
        public event PropertyChangedEventHandler PropertyChanged = delegate { };
        public void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            // Raise the PropertyChanged event, passing the name of the property whose value has changed.
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }


    Gruß Thomas
    Sage nie, ich kann es nicht - sage nur, ich kann es noch nicht!
    Dev Apps von mir: Icon für UWP,  UI Strings
    Andere Dev Apps: UWP Community Toolkit Sample App

    • Als Antwort markiert Markus222 Donnerstag, 22. Februar 2018 14:06
    Donnerstag, 22. Februar 2018 12:24
  • Oh Thomas,

    der Code ist unten.

    Natürlich schreibe ich grundsätzlich immer NotifyPropertyChanged. Grundsätzlich immer...
    Aber in dem Fall. Dennoch ist es seltsam.

    Es war so. In der Liste habe ich angezeigt wo man ist. Also von welchem Objekt die verbundenen Objekte
    in der Liste erscheinen. Das ist das untere Property Entries_Current_List_Entry_Navigated_From.
    Es ist ein Entry Objekt.

    Dann habe ich den Code kopiert (unten ist kein NotifyPropertyChanged, wurde halt vergessen)
    um ein Property für den Navigationspfad zu haben. Das ist das obere Property und ein ein String.

    Also es wurde vergessen. Überall sonst steht der Aufruf ja. Aber das seltsame ist doch unten geht es ohne.
    Habe es dann natürlich auch noch eingefügt.

    Es geht also. Das Vergessen haben war der Grund. Nur warum ging es beim unteren Property ohne den
    Aufruf von NotifyPropertyChanged?

    Vielen Dank,
    Markus

            // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            public string Entries_Current_Navigation_Path
            // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            {
                get { return entries_Current_Navigation_Path_p; }
            }
    
            // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            private void Entries_Current_Navigation_Path_Set
                         (string entry_association_path_navigated_from,
                          string P_Caller_N)
            // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            {
                string NCN_pn = NCN + "."
                                + nameof(Entries_Current_Navigation_Path_Set);
    
                Debug.Assert
                     (P_Caller_N == Entries_Current_List_From_Entry_ID_Set_pn,
                      NCN_pn + " called from wrong procedure: " + P_Caller_N);
    
                entries_Current_Navigation_Path_p
                        = entry_association_path_navigated_from;
                NotifyPropertyChanged(nameof(Entries_Current_Navigation_Path));
            }
    
    
            // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            public Entry Entries_Current_List_Entry_Navigated_From
            // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            {
                get { return entries_Current_List_Entry_Navigated_From_p; }
            }
    
            // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            private void Entries_Current_List_Entry_Navigated_From_Set
                         (Entry entry_navigated_from,
                          string P_Caller_N)
            // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            {
                string NCN_pn = NCN + "."
                                + nameof(Entries_Current_List_Entry_Navigated_From_Set);
    
                Debug.Assert
                     (P_Caller_N == Entries_Current_List_From_Entry_ID_Set_pn,
                      NCN_pn + " called from wrong procedure: " + P_Caller_N);
    
                entries_Current_List_Entry_Navigated_From_p
                        = entry_navigated_from;
            }
    
    



    • Bearbeitet Markus222 Donnerstag, 22. Februar 2018 14:06
    Donnerstag, 22. Februar 2018 14:06
  • Ich kann auch nicht erkennen warum es bei dem anderen ging.

    Noch etwas als kleine Anregung. Vermeide das verketten von Strings mit dem +. Dadurch wird immer wieder ein neuer string erzeugt was einfach nicht sein muss. Es gibt aber eine gute neue Schreibweise

    void Test()
    {
        string text1 = "Hallo";
        string text2 = "Welt";
    
        //Das $ ist wichtig
        string halloWelt = $"{text1} in der {text2}";
    }


    Gruß Thomas
    Sage nie, ich kann es nicht - sage nur, ich kann es noch nicht!
    Dev Apps von mir: Icon für UWP,  UI Strings
    Andere Dev Apps: UWP Community Toolkit Sample App

    Donnerstag, 22. Februar 2018 14:15
  • Danke. Es ist gut wenn man sparsam ist. Mit den Ressourcen.

    Andererseits sind die Computer heute so leistungsfähig das man das nicht merkt wenn Strings immer wieder neu erzeugt werden.

    Aber ich denke auch lieber sparsam. Andererseits immer Klarheit im Code. Die Lesbarkeit ist doch so wichtig. Deswegen habe ich bei Prozeduren immer im Debug.Assert die Namen der aufrufenden Methoden und Objekte.

    Das vielleicht auch als Tipp.

    Donnerstag, 22. Februar 2018 14:43