Announcement

Collapse
No announcement yet.

Binding funktionert nicht

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

  • #16
    Ab du siehst im Watch Fenster das sich der Inhalt von _Content geändert hat?

    Übrigens eine Textbox ist erstmal 1zeilig. Im Content Setter irgendwas mit Zeilenumbruch anzuhängen ist unglücklich. Mal davon abgesehen das ein Setter der anhängt und nicht ersetzt unerwartet ist.

    Comment


    • #17
      Ab du siehst im Watch Fenster das sich der Inhalt von _Content geändert hat?
      Nein, es ändert sich nichts im Inhalt von _Content, dieser bleibt immer nur "", so wie Content auch.

      Übrigens eine Textbox ist erstmal 1zeilig.
      Der TextBox habe ich ein "AcceptsReturn="True"" hinzugefügt, sodass Zeilenumbrüche angezeigt werden.

      Gü hatte dich schonmal nach dem DataContext gefragt.
      Der DataContext wurde von Visual Studio wie folgt generiert:
      [highlight=xml]
      <TextBox.DataContext>
      <Components:ServerConsole/>
      </TextBox.DataContext>
      [/highlight]

      Im Content Setter irgendwas mit Zeilenumbruch anzuhängen ist unglücklich. Mal davon abgesehen das ein Setter der anhängt und nicht ersetzt unerwartet ist.
      Bei dem Setter müsste man das also außerhalb des Setters bearbeiten?
      z.B.:
      [highlight=c#]ServerConsole.Content = ServerConsole.Content + '\n' + "Neue Zeile";[/highlight]
      Ich habe das so gelöst, da ich dachte man könnte so Code sparen

      Comment


      • #18
        Ich habe das so gelöst, da ich dachte man könnte so Code sparen
        Dann mach eine explizite Append Methode. Aber eine Property, insbesondere eine die fürs Binding gedacht ist, wo der getter potentiell was anderes liefert als ein setter reingeschrieben hat ist ein Problem. Weißt du wie oft getter/setter wann wo wie aufgerufen werden? Wenn irgendein Control meint synchronisieren zu müssen und einfach mal den Setter aufruft (ist ja eigentlich nicht schlimm schreibt einfach wieder das rein was schon drin steht) fliegt dir deine Klasse um die Ohren.

        Um die Kontrolle zu behalten sollte eine (ReadWrite) Bindingproperty immer so geschrieben sein das der getter liefert was ein setter reingeschrieben hat. Und der setter sollte auch immer nur den Wert ändern und PropertyChanged aufrufen wenn der Wert sich auch ändert also sollte da auch immer so was wie
        Code:
        if(_Content != value) { ... }
        drinstehen.

        Comment


        • #19
          Danke für deine Tips.
          ich habe nun extra eine Funktion in der Bibliothek, der man einen String übergibt und dieser dann durch die Funktion angefügt wird.

          Bezürglich dem zweiten Hinweis:
          [highlight=c#]
          private string _Content = "";
          public string Content
          {
          get
          {
          return _Content;
          }
          set
          {
          if (value != _Content)
          {
          _Content = value;
          NotifyPropertyChanged("Content");
          }
          }
          }
          [/highlight]

          Mir ist gerade noch etwas aufgefallen:
          Ich habe eine neue Funktion für das Click-Event bei einem Button geschrieben und woltle auf den Content von ServerConsole zugreifen, allerdings wird weder _Content noch Content aufgeführt. _Content ist ja klar, da private, aber Content müsste doch im DropDown-Menü von VS nach 'MCServeCore.Components.ServerConsole.' vorhanden sein oder nicht?
          Bei der Funktion für das anfügen ist Content ebenfalls nciht vorhanden. Normalerweise ist die Variable ja als static deklariert, aber dann kann diese nicht mehr mit Binding verwendet werden, oder?
          Zuletzt editiert von Xe77a; 07.11.2012, 13:29.

          Comment


          • #20
            Nach MCServeCore.Components.ServerConsole sollten alle statischen Member angezeigt werden denn das ist ja die Klasse nicht eine Instanz dieser Klasse. Da Content nicht statisch ist bekommst du die nicht zu sehen.
            ServerConsole ist auch nicht statisch definiert also arbeitest du in der Anwendung mit Instanzen der ServerConsole Klasse. Alles was du tust solltest du gegen diese Instanz machen und nicht gegen die Klasse.

            Comment


            • #21
              Könnte das vielleicht auch der Grund sein, warum nichts durch das Binding angezeigt wird, bzw. der Pfad nicht gefunden wird (s. #11)?
              Kann ich das Binding auch auf eine Instanz der Klasse setzen?

              Comment


              • #22
                DataContext ist soweit ich weiß immer eine Instanz von Irgendwas. Mir wäre nicht bewußt das man da was statisches verwenden kann.
                Irgendwo solltest du bereits eine Instanz dem DataContext zugewiesen haben (im Code oder im XAML) denn dein Watch Auszug zeigt ja auch ein MCServeCore.ComponentsServerConsole object.

                Comment


                • #23
                  Ich hatte mal eine Instanz der Klasse ServerConsole einer Variable zugewiesen. Ich habe die aber schon seit Tagen wieder gelöscht , da ich ja direkt auf die Klasse zugegriffen habe.

                  Edit :
                  Ich habe jetzt einmal nach solchen Instanzen gesucht und tatsächlich war die Variable mit der ServerConsole-Instanz vorhanden. Der Text, den ich eigentlich in der TextBox erwartet habe wurde in diese Instanz geschrieben. Schätze, dass da ein Teil des Fehlers liegt, oder?
                  Wie genau kann ich nun von der Funktion zum Anhängen (welche sich in ebenfalls in der ServerConsole-Klasse befindet) auf _Content zugreifen. Die Funktion muss ja static sein, da man sonst nicht auf die Funktion zugreifen kann, _Content und Content dürfen nicht static sein, da sonst das Binding nicht funktioniert, habe ich das so richtig verstanden?

                  Comment


                  • #24
                    Nein. Vergiß static. Das macht mit allerhöchster Wahrscheinlichkeit keinen Sinn.

                    Erzeuge eine Instanz der Klasse merk dir die in einer Variablen damit du darauf zugreifen kannst und weisse diese Instanz dem DataContext zu. Dann kann das Binding auf die Instanz über den DataContext funktionieren und wenn du so auch noch an die Instanz musst hast du die über die Variable.

                    Comment


                    • #25
                      Ich habe jetzt in der Anwwendung mit der TextBox eine Klassen-Datei mit folgenden Code hinzugefügt:
                      [highlight=c#]
                      namespace MCServe
                      {
                      public class ServerData
                      {
                      private static ServerConsole _Console = new ServerConsole();
                      public static ServerConsole Console
                      {
                      get
                      {
                      return _Console;
                      }
                      set
                      {
                      _Console = value;
                      }
                      }
                      }
                      }
                      [/highlight]
                      Das ist die Instanz der Console. Nun habe ich den Code der TextBox so abgeändert:
                      [highlight=xml]
                      <TextBox Text="{Binding Path=ServerConsole, Source=Content, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" x:Name="ConsoleTextArea" ... >
                      <TextBox.DataContext>
                      <local:ServerData/>
                      </TextBox.DataContext>
                      </TextBox>
                      [/highlight]
                      Wieder folgende Meldung "System.Windows.Data Error: 40 : BindingExpression path error: 'ServerConsole' property not found on 'object' ''String' (HashCode=1563053001)'. BindingExpression:Path=ServerConsole; DataItem='String' (HashCode=1563053001); target element is 'TextBox' (Name='ConsoleTextArea'); target property is 'Text' (type 'String')"

                      PS:
                      Gibt es vielleicht eine Lektüre, die man sich für tiefergreifende Geschichten in C# besorgen sollte. Ich habe mit C# vor knapp 3 Jahren angefangen mit einem Buch von Markt und Technik "Jetzt lerne ich Visual C# 2008" (http://www.unifachbuch.de/Buecher/ED...l-C-20081.html), aber in dem werden nur Grundlagen ausführlich beschrieben und auch nur WinForms. Kann mir jemand vielleicht eine aktuelle Version für "Fortgeschrittene" empfehlen?
                      Zuletzt editiert von Xe77a; 08.11.2012, 19:31.

                      Comment


                      • #26
                        Ich war mal ein bischen auf der Suche nach Lektüre und bin auf http://openbook.galileocomputing.de/...010_21_002.htm gestoßen. Ich bin das mal durchgelesen und es funktioniert nun. Ich denke das Problem war, dass ich die Instanz nicht in der Anwendung deklarieren wollte, da diese eigentlich zu der Kernbibliothek gehört und ebendiese nicht umbedingt mit der anwendung sondern auch mit anderen ausfürbar sein soll. Kann ich die Instanz auch irgendwie in der Bibliothek belassen und das Binding auf die Bibliothek zeigen lassen?

                        Edit :
                        Ich habe einfach die neue Instanz in den Serverteil verschoben und von private auf public gesetzt, die entsprechenden Variablen angepasst und nun funktioniert es auch. Vielen Dank für eure Hilfe
                        Zuletzt editiert von Xe77a; 08.11.2012, 20:11.

                        Comment

                        Working...
                        X