Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
WPF Datagrid Editing +Bindingproblem
reloop
myCSharp.de - Member

Avatar #avatar-3256.jpg


Dabei seit:
Beiträge: 139

Themenstarter:

WPF Datagrid Editing +Bindingproblem

beantworten | zitieren | melden

Heyho,

ich habe ein DataGrid, welches eine Spalte mit folgendem Aufbau beinhaltet:

                                    <DataGridTemplateColumn Header="Einkauf"  Width="Auto" >
                                        <DataGridTemplateColumn.CellTemplate>
                                            <DataTemplate>
                                                <ccGiControls:txtZeit Text="{Binding Einkauf, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ></ccGiControls:txtZeit>
                                            </DataTemplate>
                                        </DataGridTemplateColumn.CellTemplate>
                                    </DataGridTemplateColumn>

Er schreibt beim ändern des Inhaltes jedoch nichts zurück in meine List.

Ändere ich das "ccGiControls:txtZeit" jedoch in ein Standard "TextBox" Element:
                                    <DataGridTemplateColumn Header="Einkauf"  Width="Auto" >
                                        <DataGridTemplateColumn.CellTemplate>
                                            <DataTemplate>
                                                <TextBox Text="{Binding Einkauf, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ></TextBox >
                                            </DataTemplate>
                                        </DataGridTemplateColumn.CellTemplate>
                                    </DataGridTemplateColumn>

Funktioniert es einwandfrei. Das Objekt "txtZeit" befindet sich im selben Projekt und hat in seinem CodeBehind nichts stehen, was einfluss auf den .Text hätte.

Danke für die Hilfe
private Nachricht | Beiträge des Benutzers
talla
myCSharp.de - Experte

Avatar #avatar-3214.jpg


Dabei seit:
Beiträge: 6.862
Herkunft: Esslingen

beantworten | zitieren | melden

Hallo,

auch wenn du es sicher nicht hören willst, so wie es aussieht, liegts an der txtZeit Klasse. Sonst gibts ja keine Unterschiede. Was ist das denn für ein Control, und was macht es?

Die Angabe vom Mode beim Binding ist übrigens überflüssig. Beim TextProperty der TextBox ist das per Default so.
Baka wa shinanakya naoranai.

Mein XING Profil.
private Nachricht | Beiträge des Benutzers
reloop
myCSharp.de - Member

Avatar #avatar-3256.jpg


Dabei seit:
Beiträge: 139

Themenstarter:

beantworten | zitieren | melden

Es soll eigentlich eine Filterung auf die Uhrzeit vornehmen, doch ich habe den Code jetzt Stück für Stück entfernt und gemerkt, wenn ich folgenden Eintrag aus dem Konstruktor entferne, funktioniert es:


              if (this.Text.Length == 0)
            {
                this.Text = "00:00";
            }

Kann sich das jemand erklären!? Vor allem habe ich genau diese Technik bereits in einem anderen Projekt schonmal verwendet, und dort funktionierte es.

Ich bin dezent verwirrt.
private Nachricht | Beiträge des Benutzers
talla
myCSharp.de - Experte

Avatar #avatar-3214.jpg


Dabei seit:
Beiträge: 6.862
Herkunft: Esslingen

beantworten | zitieren | melden

Hallo,

mit der Zuweisung setzt du lokal einen Wert und der überschreibt das Binding. Siehe auch DP Value Precedence
Baka wa shinanakya naoranai.

Mein XING Profil.
private Nachricht | Beiträge des Benutzers
reloop
myCSharp.de - Member

Avatar #avatar-3256.jpg


Dabei seit:
Beiträge: 139

Themenstarter:

beantworten | zitieren | melden

Okay, verstehe.

Aber wo verwalte ich denn dann Validierungen für das Textfeld?

Mir geht gerade das Verständnis veloren, welchen Sinn dann eine Klasse macht?

(Die die richtige Uhrzeit formatiert / Ein Betragsfeld formatiert oder sonstiges..).

Sorry für mein unwissen!

        private void TextBox_LostFocus(object sender, RoutedEventArgs e)
        {
            var rZeit = new Regex(@"[0-2][0-9]:[0-6][0-9]");

            if (!rZeit.IsMatch(Text))
            {
                rZeit = new Regex(@"[0-2][0-9][0-6][0-9]");
                if (rZeit.IsMatch(Text))
                {
                    if (Text.Length != 0)
                    {
                        Text = Text.Substring(0, 2) + ":" + Text.Substring(2, 2);
                    }
                }
                else
                {
                    Text = "";
                }
            }
        }

Der Code funktioniert auch, liefert eine formatierte Uhrzeit zurück und das Binding funktioniert auch.


Nur die Codezeile im Konstruktor macht mir einen Strich durch die Rechnung.
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.856
Herkunft: Waidring

beantworten | zitieren | melden

Hallo,

für die Validierung kannst du dir ja mal MSDN Magazine: Input Validation - Enforcing Complex Business Data Rules with WPF durchlesen.


mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
userid14268
myCSharp.de - Member



Dabei seit:
Beiträge: 1.578

beantworten | zitieren | melden

Zitat von talla
Die Angabe vom Mode beim Binding ist übrigens überflüssig. Beim TextProperty der TextBox ist das per Default so.
Meeep, falsch, der Default ist an der stelle LostFocus Binding.UpdateSourceTrigger
Zitat
The TextBox.Text property has a default UpdateSourceTrigger value of LostFocus.
Daran muss man denken wenn man Enter auf ein Button hat und in der Box tippt und dann Enter drückt (Wie bei einer Search bar) dann wird der Text nicht aktualisiert es sei den man ändert es auf PropertyChanged oder klickt auf den Button
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von userid14268 am .
private Nachricht | Beiträge des Benutzers
talla
myCSharp.de - Experte

Avatar #avatar-3214.jpg


Dabei seit:
Beiträge: 6.862
Herkunft: Esslingen

beantworten | zitieren | melden

Zitat von David W
Zitat von talla
Die Angabe vom Mode beim Binding ist übrigens überflüssig. Beim TextProperty der TextBox ist das per Default so.
Meeep, falsch, der Default ist an der stelle LostFocus ;)

Hab ich was zum UpdateSourceTrigger gesagt? Nein, ich sprach vom Mode des Bindings!

Ansonsten hat Gfoidl ja schon was gepostet zu den ValidationRules. Die Validierung in einem Eventhandler ist ne sehr lokale Angelegenheit die man machen kann wenn man kein DataBinding verwendet.
Baka wa shinanakya naoranai.

Mein XING Profil.
private Nachricht | Beiträge des Benutzers
userid14268
myCSharp.de - Member



Dabei seit:
Beiträge: 1.578

beantworten | zitieren | melden

Ups - hab nix gesagt :D
private Nachricht | Beiträge des Benutzers