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

IDataErrorInfo: Methode für die Validierung einer Eingabe bei CustomControls wird nicht getriggert
teebeast
myCSharp.de - Member



Dabei seit:
Beiträge: 46
Herkunft: Bayern

Themenstarter:

IDataErrorInfo: Methode für die Validierung einer Eingabe bei CustomControls wird nicht getriggert

beantworten | zitieren | melden

Hallo,

ich habe das Problem, dass die Methode für die Validierung einer Eingabe nicht getriggert wird. Hierzu habe ich mal eine Testimplementierung gemacht, um das etwas genauer zu verdeutlichen. Das Interface IDataErrorInfo ist im ViewModel korrekt implementiert und wird hier nicht exemplarisch dargestellt.

    public class TestTextBox : TextBox
    {
        public static readonly DependencyProperty ValueProperty =
            DependencyProperty.Register("Value", typeof(int?), typeof(TestTextBox),
                new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, ValueChangedCallback));

        public TestTextBox()
        {
            this.LostFocus += (sender, args) =>
            {
                int value;
                if (string.IsNullOrWhiteSpace(this.Text)) this.Value = null;
                else if (int.TryParse(this.Text, out value)) this.Value = value;
                else this.Value = null;
            };
        }

        private static void ValueChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var control = d as TestTextBox;

            if (control == null) return;

            control.Text = string.Format("{0:F0}", control.Value);
        }

        public int? Value
        {
            get { return (int)this.GetValue(ValueProperty); }
            set { this.SetValue(ValueProperty, value); }
        }
    }

Im Xaml funktioniert die Bindung gegen Text, gegen Value aber nicht.
<local:TestTextBox Text="{Binding ElementName=Me, Path=TestValue, NotifyOnValidationError=True, Mode=TwoWay}" />
<local:TestTextBox Value="{Binding ElementName=Me, Path=TestValue, NotifyOnValidationError=True, Mode=TwoWay}" />

Hat jemand eine Idee, was in der Implementierung fehlt, sodass es auch mit dem Property Value funktioniert?

Ronny
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.999

beantworten | zitieren | melden

Zitat
Das Interface IDataErrorInfo ist im ViewModel korrekt implementiert und wird hier nicht exemplarisch dargestellt.
Wenn dem so wäre, hättest du das problem wahrscheinlich nicht.
private Nachricht | Beiträge des Benutzers
teebeast
myCSharp.de - Member



Dabei seit:
Beiträge: 46
Herkunft: Bayern

Themenstarter:

beantworten | zitieren | melden

Zitat
Wenn dem so wäre, hättest du das problem wahrscheinlich nicht.

@FZelle, ich nehme das jetzt etwas persönlich, hier meine fachliche Kompetenz in Frage zu stellen. Diesem Forum-Post gehen zwei Stunden Google-Suche voraus, bevor ich die Community hier mit meiner doch sehr speziellen Frage belästige. Würdest Du die Implementierung von IDataErrorInfo kennen und verstehen, dann hätte Dir spätestens an der XAML-Implementierung auffallen müssen, dass die Implementierung des ViewModels irrelevant ist, da in beiden Fällen gegen das gleiche Property aus dem ViewModel gebunden wird. Das Triggern für die Validation sollte aber aus der View bzw. dem Control ausgelöst werden. Einmal funktioniert es und einmal nicht. Also muss das Problem meines Wissens nach in der Implementierung von individuellen DependenyProperties liegen.

Anbei die Implementierung des ViewModels. Belehre mich eines besseren und ich verneige mich und ziehe meinen Hut.

    public class TestViewModel : INotifyPropertyChanged, IDataErrorInfo
    {
        private int? _testValue;

        public int? TestValue
        {
            get { return this._testValue; }
            set
            {
                if (this._testValue != value)
                {
                    this._testValue = value;
                    this.RaisePropertyChanged(nameof(this.TestValue));
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void RaisePropertyChanged(string propertyName)
        {
            this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        public IDictionary<string, string> ValidationErrors { get; } = new Dictionary<string, string>();

        public string this[string columnName]
        {
            get
            {
                this.ValidationErrors.Remove(columnName);

                string errorText = null;

                switch (columnName)
                {
                    case nameof(this.TestValue):
                        errorText = "TESTFEHLER";
                        break;
                }

                if (!string.IsNullOrWhiteSpace(errorText)) this.ValidationErrors.Add(columnName, errorText);

                return errorText;
            }
        }

        public string Error { get; } = null;
    }

Es wäre schön, zumindest einen Hinweis zu bekommen, wo ich mit meiner Suche ansetzen muss. Die Websuche hat leider keine brauchbaren Ansätze geliefert. Danke.
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3.003
Herkunft: Thüringen

beantworten | zitieren | melden

Stichwort Property Coercion.

LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5.655
Herkunft: Leipzig

beantworten | zitieren | melden

Zitat von teebeast
ich nehme das jetzt etwas persönlich

Dann ist das Forum evtl. nicht der richtige Ort für dich um Fragen zu stellen. Die Leute hier opfern ihre Zeit, um dir zu helfen, und nicht, um dich zu beleidigen, oder deine Kompetenz in Frage zu stellen.

Zur Umgangsweise im Forum beachte bitte [Hinweis] Wie poste ich richtig? Punkt 1
Weeks of programming can save you hours of planning
private Nachricht | Beiträge des Benutzers
teebeast
myCSharp.de - Member



Dabei seit:
Beiträge: 46
Herkunft: Bayern

Themenstarter:

beantworten | zitieren | melden

Nach ein paar frustrierenden Stunden saß das Problem vor dem Computer selbst. Es wurde ein falsches Property für die Validierung verwendet. Derer gibt es leider bei Bindungen zuhauf und mir ist es nicht aufgefallen, da mich die Spur auf eine falsche Fährte geführt hat.
<local:TestTextBox Text="{Binding ElementName=Me, Path=TestValue, ValidatesOnDataErrors=True, Mode=TwoWay}" />

@MrSparkle: Ich respektiere die hier geleistete Arbeit vollumfänglich. Nur macht der Ton die Musik und einen Fehler da zu suchen, wo ich ihn ausgeschlossen habe, ist nicht hilfreich und zielführend. Da ist keine Antwort die bessere Antwort.

Trotzdem viel Dank für Eure Hilfe.
private Nachricht | Beiträge des Benutzers
Coffeebean
myCSharp.de - Team

Avatar #avatar-3295.gif


Dabei seit:
Beiträge: 2.209
Herkunft: Deutschland/Schweiz

beantworten | zitieren | melden

Hallo teebeast,

die Erfahrung hier im Forum hat gezeigt, dass Fehler auch da sitzen _können_, wo man sie absolut und zu 100% ausgeschlossen hat. Daher ist es durchaus legitim in die Richtung zu suchen, in der du überzeugt bist den Fehler nicht zu finden. Das ist nicht böse gemeint, sondern einfach nur Hilfe an die Helfenden. Daher _kann_ das auch hilfreich und vor allem zielführend sein. Ich bitte im Namen aller Helfenden dahingehend um Verständnis falls auch in Richtungen nachgefragt wird, die für dich absolut klar sind. Damit sollte alles gesagt sein und wir wollen das nicht weiter vertiefen. Zumal das Thema ja geklärt ist.

Gruss

Coffeebean
private Nachricht | Beiträge des Benutzers