Announcement

Collapse
No announcement yet.

WPF / C# Taste , durch . ersetzen

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

  • WPF / C# Taste , durch . ersetzen

    Hallo,

    Hab in einem WPF / C# Programm mehrere Formulare mit TextBox-Controls, in denen nur double-Werte angezeigt und eingegeben werden. Jetzt möchte ich aber, egal ob man . oder , eingibt, immer ein . eingetragen wird. Wie kann man so etwas am elegantesten lösen? Soll nur auf diese Felder wirken, in einigen anderen TextBox-Elementen soll zwischen den Zeichen unterschieden wirken. Welches Ereignis kann man da abfangen, oder gibt es eine Eigenschaft dafür?

    Danke - Günther
    Günther

  • #2
    Machst Du MVVM? Oder Eventbasiert?

    Bei MVVM kannst Du doch einfach in deinem ViewModel , durch . ersetzen. Also eine einfach String.Replace(). Danach nochmal INotifyPropertyChanged feuern.
    Bei der Eventbasierten Lösung sollte eigentlich die TextBox eine KeyDown oder KeyPressed Property haben in der man die Taste abfragen und auch ändern kann.

    Comment


    • #3
      MVVM, aber die TextBox hat ein DataBinding mit einem double. Wenn ich da mit einer Stringvariablen verknüpfe, muß ich ja sämtliche Property Changes doppelt anlegen. Jetzt sieht es so aus:
      Code:
      public double d
              {
                  get { return this._d; }
                  set
                  {
                      _d = value;
                      this.OnPropertyChanged(() => this.d);
                      if (value == 0) return;
                      Berechne_A();
                  }
              }
      Eine Zuweisung für d kann über die Tastatur, aber auch über eine Berechnung erfolgen. Mit der Zuweisung über MVVM verstehe ich das so:
      Code:
      public string sd
              {
                  get { return this._d.ToString(); }
                  set
                  {
                      d = value.Replace(",",".").String2Double();
                      this.OnPropertyChanged(() => this.sd);
                  }
              }
              public double d
              {
                  get { return this._d; }
                  set
                  {
                      _d = value;
                      this.OnPropertyChanged(() => this.sd);
                      if (value == 0) return;
                      Berechne_A();
                  }
              }

      Ein Event kann ich für jede TextBox auf die gleiche Methode verweisen, das fände ich schon besser. Aber das hier geht nicht:
      Code:
      private void textBox_KeyDown(object sender, KeyEventArgs e)
              {
                  if (e.Key == Key.OemComma) e.Key = Key.OemPeriod;
              }
      Fehler 1 Einer Eigenschaft oder einem Indexer "System.Windows.Input.KeyEventArgs.Key" kann nichts zugewiesen werden -- sie sind schreibgeschützt.
      Günther

      Comment


      • #4
        Dann mach doch in dem ViewModel aus dem double einen String Dann kannst Du die Konvertierung so gestalten wie Du willst. Dafür ist es doch oder irre ich mich?

        Comment


        • #5
          Dann brauche ich entweder zwei PropertyChanged-Methoden, wie oben beschrieben,

          oder ich muß in jeder Berechnung in der ein double zugewiesen wird, ein ToString() anhängen:
          statt
          Code:
          public void Berechne_A()
                  {
                      A = _d * _d * Math.PI / 4;
                  }
          wird das dann
          Code:
          public void Berechne_A()
                  {
                      double __A =  _d * _d * Math.PI / 4;
                      A=__A.ToString();
                  }
          Finde ich sehr unübersichtlich...



          Da gibt es irgendwo im Code :-) eine Funktion, die die TextBox rot einfärbt wenn ich einen Buchstaben in dem Zahlenfeld eintippe. Tippe ich den . ein, wird der korrekt übernommen, tippe ich ein , ein wird es zwar erst angezeigt, ist nach der nächsten Zifferneingabe aber wieder verschwunden....
          Kann man da was erweitern?
          Günther

          Comment


          • #6
            Originally posted by Günther Weber View Post
            Code:
            private void textBox_KeyDown(object sender, KeyEventArgs e)
                    {
                        if (e.Key == Key.OemComma) e.Key = Key.OemPeriod;
                    }
            Was spricht dagegen den gewünschten Key hier einfach direkt in die Textbox zu schreiben? Also

            Code:
            (sender as Textbox).Text += ".";
            und dann e.Handled auf true zu setzen? So würde ich es zumindest in Winforms machen .... wenn denn Key dort auch ReadOnly wäre


            Edit: Der Gedanke von mir war nicht ganz richtig. Bin davon ausgegangen das ein neues Zeichen immer hinten angehängt wird, was so natürlich nicht richtig ist. Hier eine bessere Lösung.
            Zuletzt editiert von Ralf Jansen; 15.04.2011, 12:06.

            Comment


            • #7
              Eigentlich sollten solche Berechnungen auch nicht im ViewModel sondern in Deinem Model durchgeführt werden. Ansonsten ist es kein sauberes Separation on Concern. Der ein Concern ist: Wandele mir den String in eine Zahl, egal ob mit Punkt oder Komma. Der andere Concern ist: Berechne mir den neuen Wert der Zahl im Modell.

              Comment

              Working...
              X