سؤال

لدي المستخدم التحكم الذي يحتوي على مربع نص.لدي الدرجة يسمى الشخص الذي ينفذ IDataErrorInfo واجهة:

class Person : IDataErrorInfo
{
private bool hasErrors = false;
#region IDataErrorInfo Members

        public string Error
        {            
            get 
            {
                string error = null;
                if (hasErrors)
                {
                    error = "xxThe form contains one or more validation errors";
                }
                return error;
            }
        }

        public string this[string columnName]
        {
            get 
            {
                return DoValidation(columnName);
            }
        }
        #endregion
}

الآن usercontrol يعرض طريقة تسمى SetSource من خلالها رمز مجموعات الربط:

public partial class TxtUserControl : UserControl 
    {          
        private Binding _binding;

        public void SetSource(string path,Object source)
        {
            _binding = new Binding(path);
            _binding.Source = source;
            ValidationRule rule;
            rule = new DataErrorValidationRule();
            rule.ValidatesOnTargetUpdated = true;            
            _binding.ValidationRules.Add(rule);
            _binding.ValidatesOnDataErrors = true;
            _binding.UpdateSourceTrigger = UpdateSourceTrigger.LostFocus;
            _binding.NotifyOnValidationError = true;            
            _binding.ValidatesOnExceptions = true;
            txtNumeric.SetBinding(TextBox.TextProperty, _binding);                
        }
...
}

WPF الإطار الذي يتضمن عنصر التحكم المستخدم التعليمات البرمجية التالية:

public SampleWindow()
    {
        person= new Person();
        person.Age = new Age();
        person.Age.Value = 28;

        numericAdmins.SetSource("Age.Value", person);
    }
    private void btnOk_Click(object sender, RoutedEventArgs e)
    {         

        if(!String.IsNullOrEmpty(person.Error))
        {
            MessageBox.Show("Error: "+person.Error);
        }
    }

ونظرا لهذا القانون ، ملزمة يسير على ما يرام ، ولكن التحقق لم يحصل تشغيلها.ما الخطأ في هذا الكود ؟

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

المحلول

الخاص بك Age الفئة سوف تحتاج إلى تنفيذ IDataErrorInfo.الخاص بك Person الفئة لن يطلب منك التحقق من صحة Age's خصائص.

إذا كان هذا ليس خيارا ، كتبت التحقق من صحة نظام WPF التي الموسعة بما يكفي لدعم هذا.الرابط هنا:

في الرمز البريدي هو مستند word واصفا إياه.

تحرير:هنا طريقة واحدة يمكن سن تنفيذ IDataErrorInfo دون أن تكون ذكية جدا:

class Constraint 
{
    public string Message { get; set; }
    public Func<bool> Validate;
    public string Name { get; set; }
}

class Age : IDataErrorInfo
{
    private readonly List<Constraint> _constraints = new List<Constraint>();

    public string this[string columnName]
    {
        get 
        {
            var constraint = _constrains.Where(c => c.Name == columnName).FirstOrDefault();
            if (constraint != null)
            {
                if (!constraint.Validate())
                {
                    return constraint.Message;
                }
            }
            return string.Empty;
        }
    }
}

class Person
{
    private Age _age;

    public Person() 
    {
        _age = new Age(
            new Constraint("Value", "Value must be greater than 28", () => Age > 28);
    }
}

أيضا راجع هذا الرابط:

http://www.codeproject.com/KB/cs/DelegateBusinessObjects.aspx

نصائح أخرى

وثمة خيار آخر يمكن أن يكون لتنفيذ IDataErrorInfo على الطبقة العمر وإنشاء حدث في ذلك مثل OnValidationRequested التي يجب أن يتم القبض من قبل الطبقة شخص. بهذه الطريقة يمكن التحقق من صحة الحقل العمر استنادا إلى خصائص أخرى من فئة الشخص.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top