سؤال

في صفي الذي أقوم بتنفيذه INotifyDataErrorInfo وهو يعمل بشكل جيد عندما يحدث خطأ التحقق من الصحة. إنه يضع هذا الإطار الأحمر حول مربع النص ، لكنه لا يتخلص منه عند إصلاح خطأ التحقق من الصحة.

ها هو رمزتي:

    string IDataErrorInfo.this[string columnName]
    {
        get
        {
            string error = null;
            if (Context != null)
            {
                var messages = //GetMessages(); messages are validation errors
                if (messages.Count != 0)
                {
                    error = "This is critical error. Must be fixed";
                    AddError(columnName, "Some kind of error happend", false);
                }
                else
                {
                    RemoveError(columnName);
                }
            }
            return error;
        }
    }

    //I call this method to check for validation errors.
    public void CheckValidationErrors(string propertyName)
    {
        var error = this as IDataErrorInfo;
        string message = error[propertyName];

    }


    private Dictionary<String, List<String>> errors =
        new Dictionary<string, List<string>>();

    public void AddError(string propertyName, string error, bool isWarning)
    {
        if (!errors.ContainsKey(propertyName))
            errors[propertyName] = new List<string>();

        if (!errors[propertyName].Contains(error))
        {
            if (isWarning) errors[propertyName].Add(error);
            else errors[propertyName].Insert(0, error);
            RaiseErrorsChanged(propertyName);
        }
    }

    public void RemoveError(string propertyName, string error="")
    {
        if (error == "")
        {
            errors.Remove(propertyName);
            RaiseErrorsChanged(propertyName);
        }
        else
        {
            if (errors.ContainsKey(propertyName) &&
                errors[propertyName].Contains(error))
            {
                errors[propertyName].Remove(error);
                if (errors[propertyName].Count == 0) errors.Remove(propertyName);
                RaiseErrorsChanged(propertyName);
            }
        }
    }

    public void RaiseErrorsChanged(string propertyName)
    {
        if (ErrorsChanged != null)
            ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName));
    }


    public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;

    public System.Collections.IEnumerable GetErrors(string propertyName)
    {
        if (String.IsNullOrEmpty(propertyName) ||
            !errors.ContainsKey(propertyName)) return null;
        return errors[propertyName];
    }

    public bool HasErrors
    {
        get { return errors.Count > 0; }
    }

أنا أتصل بـ RemoveRror () طريقة لإزالة الأخطاء. أفعل شيئا خاطئا؟ عند إصلاح التحقق من الصحة ، أحتاج إلى الانتقال إلى مربع النص وستعتني به. أريد إزالة هذا الإطار الأحمر على الفور عند اختفاء خطأ التحقق.

تحديث:

عندما أقوم بكتابة شيء ما إلى مربع النص ، أحتاج إلى إرسال هذه المعلومات إلى الخادم بشكل غير متزامن وسوف تجلب لي الاستجابة رسالة إذا كانت هناك أي مشاكل التحقق من الصحة. لذلك لا يمكنني القيام بالتحقق من صحة الأشياء على الممتلكات التي تغيرت. سوف أتحقق من الاستجابة إذا تمت إضافة أي رسالة أو إزالتها. إذا تمت إزالته ، فسأتصل بـ CheckValidationErrors ().

إجابه

كنت تنفذ IDataErrorInfo ثم قررت التنفيذ INotifyDataErrorInfo. كنت أفكر في جعل هذا التحقق من العمل الذي أحتاجه لتنفيذ كلا الواجهات. لذلك أزلت بشكل أساسي IDataErrorInfo تنفيذ من صفي والتي حددت المشكلة.

شكرا للمساعدة!

هل كانت مفيدة؟

المحلول 2

كنت تنفذ IDataErrorInfo ثم قررت التنفيذ INotifyDataErrorInfo. كنت أفكر في جعل هذا التحقق من العمل الذي أحتاجه لتنفيذ كلا الواجهات. لذلك أزلت بشكل أساسي IDataErrorInfo تنفيذ من صفي والتي حددت المشكلة.

نصائح أخرى

القيمة الافتراضية UpdateSourceTrigger إلى عن على TextBox هو LostFocus.

يجب عليك تغييره إلى PropertyChanged إذا كنت ترغب في تشغيل منطق التحقق من الصحة على الفور بمجرد إصلاح الخطأ.

<TextBox Text="{Binding PropertyName, UpdateSourceTrigger=PropertyChanged}"/>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top