3 Stimmen

Warum werden meine Validierungsregeln nicht ausgeführt, wenn der DataContext gesetzt ist?

Ich habe das folgende Loaded-Ereignis in meinem Fenster:

void Window_Loaded(object sender, RoutedEventArgs e) {
    this.DataContext = new MyObject() {
        MyDateTime = DateTime.Now,
        MyNotEmptyString = "Not Empty",
        MyNotUpperCaseString = "not upper case",
        MyInteger = 20,
        MyIntegerInRange = 1,
        MyDouble = 4.56
    };
}

Für jede Eigenschaft, die oben initialisiert wurde, habe ich eine TextBox die mit ihr verbunden sind, wobei jede ihre eigene(n) Validierungsregel(n) hat.

Das Problem ist, dass meine Validierungsregeln nicht gleich beim ersten Mal ausgeführt werden, wenn this.DataContext gesetzt ist, aber gut funktionieren, wenn das Formular normal verwendet wird (sie werden ausgeführt, wenn die TextBox verliert den Fokus). Was könnte der Grund dafür sein? Ich habe versucht, die Einstellung UpdateSourceTrigger="PropertyChanged" aber das hat nicht geholfen.

編集する。 Hier ist ein Beispiel für eine TextBox die an eine Eigenschaft gebunden ist:

<TextBox Name="MyDoubleField">
    <TextBox.Text>
        <Binding Path="MyDouble">
            <Binding.ValidationRules>
                <local:TextIsDouble/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

3voto

Henk Holterman Punkte 249753

Die Antwort auf die Frage nach dem "Warum" ist einfach: Das ist eine Frage des Designs. Die Validierung bezieht sich in der Regel auf Benutzereingaben, sie ist nicht dazu gedacht, gespeicherte Daten zu validieren.

Ich denke, die zugrundeliegende Frage ist: Wie kann man die Validierung nach dem Setzen des Kontexts manuell aktivieren. Ich bin nicht sicher, aber vielleicht ein WPF-Fenster hat etwas wie WinForms Validate() Methode.

0voto

TheCodeMonk Punkte 1609

Gibt es einen Grund, warum Ihre Validierung nicht in Ihren Datenklassen enthalten ist? Mit IDataErrorInfo sollte die Daten sofort validieren und dann Blase, dass bis zu Ihrem UI ohne etwas extra zu tun.

Ich sage "sollte", weil das bei uns funktioniert, aber wir verwenden kein WPF.

0voto

Carlos G. Punkte 4453

Der Grund, warum Ihre Validierungen nicht ausgeführt werden, wenn Sie den DataContext festgelegt ist, weil WPF nur Validierung ausgeführt wird, wenn die Quelle mit dem Wert aus dem Ziel aktualisiert wird (AKA, Textbox geändert wird und die Quelle entsprechend aktualisiert wird).

Wenn Sie Ihre Daten beim Festlegen des DataContext validieren möchten, müssen Sie den logischen Baum durchlaufen und für jedes Element, für das Sie die Validierung durchführen möchten, dessen BindingExpression abrufen und dann die Methode UpdateSource für den Bindungsausdruck aufrufen. Das wird eine Validierung erzwingen.

Der Code für so etwas wäre:

    private void ValidateData()
    {            
        //The XAML file defines a group of TextBox elements inside a Grid called grd
        foreach (UIElement uie in grd.Children)
        {
            if (uie.GetType() == typeof(TextBox))
            {
                ((TextBox)uie).GetBindingExpression(TextBox.TextProperty).UpdateSource();          
            }
        }                    
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X