Laden...

WPF Datagrid Editing +Bindingproblem

Erstellt von reloop vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.995 Views
reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren
WPF Datagrid Editing +Bindingproblem

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

6.862 Beiträge seit 2003
vor 13 Jahren

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.

reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren

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.

6.862 Beiträge seit 2003
vor 13 Jahren

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.

reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren

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.

6.911 Beiträge seit 2009
vor 13 Jahren

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!"

U
1.578 Beiträge seit 2009
vor 13 Jahren

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

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

6.862 Beiträge seit 2003
vor 13 Jahren

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 😉){gray}

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.

U
1.578 Beiträge seit 2009
vor 13 Jahren

Ups - hab nix gesagt 😄