Announcement

Collapse
No announcement yet.

Binding funktionert nicht

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Binding funktionert nicht

    Hallo an alles Leser,

    mit diesem Problem laufe ich jetzt schon länger rum. Ich arbeite hier mit C# und WPF.
    Ich habe eine TextBox, dessen Inhalt immer den aktuellen Inhalt eines Strings anzeigen soll. Dieser kann aber auch von anderen Bibliotheken verändert werden. Dazu habe ich nun folgenden Code verwendet : [highlight=c#]<TextBox Text="{Binding MCServeCore.ServerData.ConsoleContent.Content, UpdateSourceTrigger=PropertyChanged}" ...[/highlight] MCServeCore ist eine der Bibliotheken, ServerData ist eine Klassen in der mehrere Variablen deklariert werden. ConsoleContent ist die Variable für eine weitere Klasse : [highlight=c#]namespace MCServeCore.Components
    {
    public class ServerConsole
    {
    private string _Content = "";
    public string Content
    {
    get
    {
    return _Content;
    }
    set
    {
    _Content = _Content + '\n' + value;
    }
    }
    }
    }[/highlight]

    Wenn nun die Anwendung startet, dann werden am Ende des Strings diverse Daten angefügt. Diese werden dann aber nicht in der TextBox angezeigt. Wenn ich den Inhalt über eine MessageBox ausgebe ist der Inhalt aber zusehen. Was mache ich falsch?

    Danke im vorraus.
    MfG Xe77a

  • #2
    Hallo,

    INotifyPropertyChanged muss auch implementiert sein, damit das Binding die Änderung mitbekommt.

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Hi, danke für deine Antwort.

      Wie müsste man das bewerkstelligen? Ich habe mal dazu folgendes gelesen:
      [highlight=c#]
      namespace MCServeCore.Components
      {
      public class ServerConsole : INotifyPropertyChanged
      {
      private string _Content = "";
      public string Content
      {
      get
      {
      return _Content;
      }
      set
      {
      _Content = _Content + '\n' + value;
      }
      }
      }
      }
      [/highlight]

      MfG Xe77a

      Edit:

      Ich habe über http://msdn.microsoft.com/de-de/libr...=vs.85%29.aspx ein Beispiel gefunden. Der Code sieht nun so aus:
      [highlight=c#]
      using System;
      using System.ComponentModel;

      namespace MCServeCore.Components
      {
      public class ServerConsole : INotifyPropertyChanged
      {
      public event PropertyChangedEventHandler PropertyChanged;
      private void NotifyPropertyChanged(String info)
      {
      if (PropertyChanged != null)
      {
      PropertyChanged(this, new PropertyChangedEventArgs(info));
      }
      }

      private string _Content = "";
      public string Content
      {
      get
      {
      return _Content;
      }
      set
      {
      _Content = _Content + '\n' + value;
      NotifyPropertyChanged("Content");
      }
      }
      }
      }
      [/highlight]
      Es gibt aber keine Änderung.

      PS: Mir ist gerade auch aufgefallen, dass es sich nicht um WPF sondern um WinForms/WebForms handelt, also wird das der Grund sein warum der Code der Seite nicht funktioniert.
      Zuletzt editiert von Xe77a; 05.11.2012, 01:41.

      Comment


      • #4
        INotifyPropertyChanged funktioniert in WPF genauso.

        Comment


        • #5
          Kannst du mir dann sagen, wo der Fehler in meinem Code liegt? Denn so funktioniert mein Code nicht / nicht korrekt.

          Edit:
          Mir ist gerade aufgefallen, dass ich ein Stück Code noch nicht gezeigt habe :
          [highlight=c#]
          <TextBox Text="{Binding MCServeCore.ServerData.ConsoleContent.Content, UpdateSourceTrigger=PropertyChanged}" Grid.Column="0" Grid.Row="0" FontFamily="Segoe UI" x:Name="ConsoleTextArea" Margin="5" Grid.ColumnSpan="2" AcceptsReturn="True" AcceptsTab="True" AutoWordSelection="True" IsReadOnly="True">
          <TextBox.SelectionBrush>
          <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
          <GradientStop Color="#FF7ABCFF" Offset="0"/>
          <GradientStop Color="#FF4096EE" Offset="1"/>
          </LinearGradientBrush>
          </TextBox.SelectionBrush>
          </TextBox>
          [/highlight]

          Das ist die TextBox, in der der Inhalt des String angezeigt werden soll.

          Comment


          • #6
            Schau Dir mal nach dem Beenden des Programms das Fenster "Ausgabe" in Visual Studio an. Evtl mußt Du vorher unter Extras - Einstellungen auf Experteneinstellungen schalten.
            Günther

            Comment


            • #7
              Versuch es mal so. Ich hab den Verdacht, dass bei NotifyPropertyChanged auch die Adresse der Property überprüft wird, und wenn die unverändert ist, der Inhalt nicht weiter geprüft wird.
              Code:
                      private string _Content = ""; 
                      public string Content       
                      {     
                           get    
                           {  
                                 return _Content;     
                           }   
                           set     
                           {       
                                  string s= _Content + '\n' + value;
                                 _Content=s;        
                                  NotifyPropertyChanged("Content");  
                            } 
                      }
              


              Zuletzt editiert von Günther Weber; 05.11.2012, 22:27. Reason: Formatierung war Schrott
              Günther

              Comment


              • #8
                Hallo,

                der Verdacht von Günther ist leider falsch. Die Methode NotifyPropertyChanged feuert ja nur das PropertyChanged-Ereignis und die registrierten Handler bearbeiten das Ereignis. In WPF ist dies hier der Bindungsmechanismus, der daraufhin den Wert neu liest, sprich den Wert der vom Getter der Eigenschaft zurückgegeben wird.

                Die Textbox hat - wenn ich mich nicht irre - als BindindMode standardmäßig TwoWay. Probiere mal das explizit zu setzen. Sonst hilft wirklich nur im Ausgabefenster zu schauen was los od. per einem Tool wie Snoop od. WPF Inspector.

                mfG Gü
                "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                Comment


                • #9
                  Hi,

                  ich habe den BindingMode auf TwoWay und jede andere Möglichkeit gesetzt. Das Ergebnis hat sich nicht geändert. Ich habe deswegen jetzt hier einmal die Ausgabe von Visual Studio 2012.

                  [highlight=c#]
                  1>------ Neues Erstellen gestartet: Projekt: MCServeLib, Konfiguration: Debug Any CPU ------
                  1> MCServeLib -> C:\Users\Lars\Documents\Visual Studio 2012\Projects\MCServe\Build\MCServeLib.dll
                  2>------ Neues Erstellen gestartet: Projekt: MCServeCore, Konfiguration: Debug Any CPU ------
                  3>------ Neues Erstellen gestartet: Projekt: MCServeUpdate, Konfiguration: Debug Any CPU ------
                  2>C:\Users\Lars\Documents\Visual Studio 2012\Projects\MCServe\MCServeCore\Settings\ServerP roperties.cs(201,30,201,31): warning CS0168: Die Variable 'e' ist deklariert, wird aber nie verwendet.
                  2> MCServeCore -> C:\Users\Lars\Documents\Visual Studio 2012\Projects\MCServe\Build\MCServeCore.dll
                  3> MCServeUpdate -> C:\Users\Lars\Documents\Visual Studio 2012\Projects\MCServe\Build\MCServeUpdate.exe
                  4>------ Neues Erstellen gestartet: Projekt: MCServeConsole, Konfiguration: Debug Any CPU ------
                  4> MCServeConsole -> C:\Users\Lars\Documents\Visual Studio 2012\Projects\MCServe\Build\MCServeConsole.exe
                  5>------ Neues Erstellen gestartet: Projekt: MCServe, Konfiguration: Debug Any CPU ------
                  5> MCServe -> C:\Users\Lars\Documents\Visual Studio 2012\Projects\MCServe\Build\MCServe.exe
                  ========== Alles neu erstellen: 5 erfolgreich, 0 fehlerhaft, 0 übersprungen ==========
                  [/highlight]

                  Ich habe hier einmal den kompletten Code für die TextBox, vielleicht ist dort ja ein Fehler, den ich übersehen habe:
                  [highlight=xml]
                  <TextBox Text="{Binding Path=MCServeCore.ServerData.ConsoleContent.Content , UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Grid.Column="0" Grid.Row="0" FontFamily="Segoe UI" x:Name="ConsoleTextArea" Margin="5" Grid.ColumnSpan="2" AcceptsReturn="True" AcceptsTab="True" AutoWordSelection="True" IsReadOnly="True">
                  <TextBox.SelectionBrush>
                  <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                  <GradientStop Color="#FF7ABCFF" Offset="0"/>
                  <GradientStop Color="#FF4096EE" Offset="1"/>
                  </LinearGradientBrush>
                  </TextBox.SelectionBrush>
                  </TextBox>
                  [/highlight]

                  Ich habe am Anfang auch ein 'Path' gesetzt, in diverseren Beispielen sah ich das so und ich hatte gehofft, dass es vielleicht nun funktioniert.
                  Zuletzt editiert von Xe77a; 06.11.2012, 12:53. Reason: Etwas vergessen

                  Comment


                  • #10
                    Hallo,

                    mit Inhalt des Ausgabefensters ist hier gemeint, was nach dem Debug-Lauf im Debug-Abschnitt (siehe DropDown im Ausgabefenster) gemeint ist. Dort stehe Bindungsfehler, etc.

                    Sonst:
                    Der DataContext ist korrket gesetzt? Schau mal mit Snoop od. WPF Inspector rein, da kannst du den DataContext und sonst alles Live beobachten und ändern.

                    mfG Gü
                    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                    Comment


                    • #11
                      Hi,

                      ich hab einmal den Debug gestartet, da die Ausgabe zu lang ist habe ich folgende Datei angehängt :output.txt

                      Am Ende steht zwar, dass die Quelle nicht gefunden werden konnte, allerdings werde ich daraus nicht wirklich schlau.

                      Mit dem ursprünlichen Code ist die letzte Meldung folgende
                      [highlight=c#]
                      System.Windows.Data Error: 40 : BindingExpression path error: 'MCServeCore' property not found on 'object' ''ServerConsole' (HashCode=102520)'. BindingExpression:Path=MCServeCore.Components.Serv erConsole; DataItem='ServerConsole' (HashCode=102520); target element is 'TextBox' (Name='ConsoleTextArea'); target property is 'Text' (type 'String')[/highlight]

                      Der Code:
                      [highlight=xml]
                      <TextBox Text="{Binding MCServeCore.Components.ServerConsole, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" ...
                      [/highlight]
                      Zuletzt editiert von Xe77a; 06.11.2012, 15:32.

                      Comment


                      • #12
                        muß es nicht

                        Binding MCServeCore.Components.ServerData...
                        heißen?


                        Ach, das hast Du ja schon geändert...
                        Zuletzt editiert von Günther Weber; 06.11.2012, 21:08. Reason: #11 gelesen
                        Günther

                        Comment


                        • #13
                          Wenn man sich die betroffene Zeile in der Ausgabe ansieht, dann steht da ja auch "path error: 'MCServeCore' property not found on 'object' ''ServerConsole' ..." und MCServeCore ist ja keine property sondern ein namespace (der namespace einer bibliothek). Kann es sein, dass ich irgendetwas an MCServeCore anpassen, z.B. ein Modifizierer, etc. hinzufügen?

                          Comment


                          • #14
                            Gü hatte dich schonmal nach dem DataContext gefragt. Wie sieht der aus? Ohne das ist die ganze wie muss der Path aussehen nur Raterrei. Aus der Fehlermeldung könnte ich zum Beispiel raten das der DataContext schon auf eine ServerConsole Instanz zeigt. Dann wäre Path nur noch Content.

                            Comment


                            • #15
                              In der Überwachung steht folgendes:
                              [highlight=c#]
                              ConsoleTextArea.DataContext {MCServeCore.Components.ServerConsole} object {MCServeCore.Components.ServerConsole}
                              _Content "" string
                              Content "" string
                              PropertyChanged null System.ComponentModel.PropertyChangedEventHandler
                              [/highlight]
                              Auch wenn etwas durch die Bibliothek in dem string geändert wird verändert sich die Anzeige nicht.

                              Comment

                              Working...
                              X