Laden...

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

Erstellt von teebeast vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.264 Views
T
teebeast Themenstarter:in
50 Beiträge seit 2010
vor 7 Jahren
IDataErrorInfo: Methode für die Validierung einer Eingabe bei CustomControls wird nicht getriggert

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

F
10.010 Beiträge seit 2004
vor 7 Jahren

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.

T
teebeast Themenstarter:in
50 Beiträge seit 2010
vor 7 Jahren

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.

3.003 Beiträge seit 2006
vor 7 Jahren

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)

5.658 Beiträge seit 2006
vor 7 Jahren

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

T
teebeast Themenstarter:in
50 Beiträge seit 2010
vor 7 Jahren

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.

2.207 Beiträge seit 2011
vor 7 Jahren

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