Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在WPF中将数据模型与验证分离?_C#_Wpf_Data Binding_Solid Principles - Fatal编程技术网

C# 如何在WPF中将数据模型与验证分离?

C# 如何在WPF中将数据模型与验证分离?,c#,wpf,data-binding,solid-principles,C#,Wpf,Data Binding,Solid Principles,我使用下面的代码在WPF中实现模型。但问题是它违反了坚实的原则[设计模式],因为模型和验证代码都在同一个代码中。 帮我把它们分开 员工模式- public class EmployeeModel : Model { #region Fields private int employeeId; private string employeeCode; private string firstName; private string lastName;

我使用下面的代码在WPF中实现模型。但问题是它违反了坚实的原则[设计模式],因为模型和验证代码都在同一个代码中。 帮我把它们分开

员工模式-

public class EmployeeModel : Model
{
    #region Fields
    private int employeeId;
    private string employeeCode;
    private string firstName;
    private string lastName;
    private DateTime? dateOfJoining;
    private DateTime dob;
    private string email;
    private int? departmentId;
    private string departmentName;
    private string password;
    private string role;
    #endregion

    #region Public Properties
    public int EmployeeId
    {
        get
        {
            return employeeId;
        }
        set
        {
            if (value != this.employeeId)
            {
                employeeId = value;
                SetPropertyChanged("EmployeeId");
            }
        }
    }
    public string EmployeeCode
    {
        get
        {
            return employeeCode;
        }
        set
        {
            if (value != this.employeeCode)
            {
                employeeCode = value;
                SetPropertyChanged("EmployeeCode");
            }
        }
    }
    public DateTime? DateOfJoining
    {
        get
        {
            return dateOfJoining;
        }
        set
        {
            if (value != this.dateOfJoining)
            {
                dateOfJoining = Convert.ToDateTime(value);
                SetPropertyChanged("DateofJoining");
            }
        }
    }
    public string FirstName
    {
        get
        {
            return firstName;
        }
        set
        {
            if (value != this.firstName)
            {
                firstName = value;
                SetPropertyChanged("FirstName");
            }
        }
    }
    public string LastName
    {
        get
        {
            return lastName;
        }
        set
        {
            if (value != this.lastName)
            {
                lastName = value;
                SetPropertyChanged("LastName");
            }
        }
    }
    public string FullName
    {
        get
        {
            return string.Join(" ", new[] { firstName, lastName });
        }
    }
    public int? DepartmentId
    {
        get
        {
            return departmentId;
        }
        set
        {
            if (value != this.departmentId)
            {
                departmentId = value;
                SetPropertyChanged("DepartmentId");
            }
        }
    }
    public string DepartmentName
    {
        get
        {
            return departmentName;
        }
        set
        {
            if (value != this.departmentName)
            {
                departmentName = value;
                SetPropertyChanged("DepartmentName");
            }
        }
    }
    public DateTime DOB
    {
        get
        {
            return dob;
        }
        set
        {
            if (value != this.dob)
            {
                dob = Convert.ToDateTime(value);
                SetPropertyChanged("DateofBirth");
            }
        }
    }
    public string Email
    {
        get
        {
            return email;
        }
        set
        {
            if (value != this.email)
            {
                email = value;
                SetPropertyChanged("Email");
            }
        }
    }
    public string Password
    {
        get
        {
            return password;
        }
        set
        {
            if (value != this.password)
            {
                password = value;
                SetPropertyChanged("Password");
            }
        }
    }
    public string Role
    {
        get
        {
            return role;
        }
        set
        {
            if (value != this.role)
            {
                role = value;
                SetPropertyChanged("Role");
            }
        }
    }
    #endregion

    #region Private Methods
    private bool IsValid(string emailaddress)
    {
        try
        {
            MailAddress m = new MailAddress(emailaddress);

            return true;
        }
        catch (Exception)
        {
            return false;
        }
    }
    #endregion

    #region Public Methods
    public override string GetErrorForProperty(string propertyName)
    {
        string retErrorMsg = string.Empty;
        switch (propertyName)
        {
            case "EmployeeCode":
                if (EmployeeCode == null || EmployeeCode.Length < 2)
                {
                    retErrorMsg = AppConstants.EmpCodeError;
                }
                break;
            case "FirstName":
                if (FirstName == null || FirstName == string.Empty)
                {
                    retErrorMsg = AppConstants.FNameError;
                }
                break;
            case "LastName":
                if (LastName == null || LastName == string.Empty)
                {
                    retErrorMsg = AppConstants.LNameError;
                }
                break;

            case "DepartmentId":
                if (DepartmentId == null || DepartmentId < 1)
                {
                    retErrorMsg = AppConstants.DepartmentError;
                }
                break;
            case "DOB":
                if (DOB.AddYears(60).Date < DateTime.Now.Date || DOB.AddYears(18).Date > DateTime.Now.Date)
                {
                    retErrorMsg = AppConstants.DOBError;
                }
                break;
            case "DateOfJoining":
                if (DateOfJoining == null || DateOfJoining > DateTime.Now)
                {
                    retErrorMsg = AppConstants.DOJError;
                }
                break;

            case "Role":
                if (!(Role == "A" || Role == "U"))
                {
                    retErrorMsg = AppConstants.RoleError;
                }
                break;

            case "Email":
                if (!IsValid(Email))
                {
                    retErrorMsg = AppConstants.EmailError;
                }
                break;
            case "Password":
                if ((Password == null || Password.Length < 8))
                {
                    retErrorMsg = AppConstants.PasswordError;
                }
                break;
        }
        return retErrorMsg;
    }
    #endregion
}

如果您担心Solid中的S(单一责任原则),您应该看看以下答案:


基本上,“ViewModel单一责任是为视图提供它所需的信息。”我个人认为,您应该关心的是,数据模型是如何不知道视图的,而不是其他任何东西。

如果您担心的是实实在在的S(单一责任原则),您应该看看这个答案:


基本上,“ViewModel单一责任是为视图提供它所需的信息。”我个人认为,您应该关心的是,数据模型是如何不知道视图的,而不是其他任何东西。

如果您担心的是实实在在的S(单一责任原则),您应该看看这个答案:


基本上,“ViewModel单一责任是为视图提供它所需的信息。”我个人认为,您应该关心的是,数据模型是如何不知道视图的,而不是其他任何东西。

如果您担心的是实实在在的S(单一责任原则),您应该看看这个答案:


基本上,“ViewModel的单一职责是为视图提供它所需的信息。”就个人而言,我认为您应该关心的是,数据模型是如何不知道视图的,而不是其他任何东西。

下面是一个代码中的小示例:

public class EmployeesEditViewModel : INotifyPropertyChanged
{
    public string UserInputNewName
    {
        get
        {
            return Model.EmployeName;
        }
        set
        {
            if (ValidateValue(value))
            {
                Model.EmployeName = value;
                ValidationResult = string.Empty;
                OnPropertyChanged("UserInputNewName");
            }
            else
            {
                ValidationResult = "Error, name must not be empty.";
            }
        }
    }

    private bool ValidateValue(string value)
    {
        return !string.IsNullOrWhiteSpace(value);
    }

    private string _ValidationResult;

    public string ValidationResult
    {
        get
        {
            return _ValidationResult ?? string.Empty;
        }
        set
        {
            _ValidationResult = value;
            OnPropertyChanged("ValidationResult");
        }
    }

    private EmployeeModel Model { get; set; }
}

public class EmployeeModel
{
    public int EmployeeId { get; set; }

    public string EmployeName { get; set; }
}
说明:

  • 你有一个EmployeeModel,这是描述员工的真实模型。您的视图(例如带有用户输入字段的WPF窗口)不了解模型-模型和视图之间没有直接联系
  • 视图只知道有关视图模型的信息。假设这是一个允许您修改员工的掩码,那么我们将使用EmployeesEditViewModel进行修改。ViewModel公开视图所需的属性,在这个简单的例子中,它只是员工的姓名和验证结果(可以显示在另一个文本字段中)。当用户输入一个值时,您可以检查它是否有效,然后更新实际模型或告诉用户出了什么问题

  • 理想情况下,您可能在模型本身上有一些验证逻辑,并且让ViewModel仅将此结果转换为用户可以看到的内容。这将保留模型所属的所有责任(如验证),但您仍然拥有一个ViewModel,可以将其转换并转发到视图中。

    下面是一个代码示例:

    public class EmployeesEditViewModel : INotifyPropertyChanged
    {
        public string UserInputNewName
        {
            get
            {
                return Model.EmployeName;
            }
            set
            {
                if (ValidateValue(value))
                {
                    Model.EmployeName = value;
                    ValidationResult = string.Empty;
                    OnPropertyChanged("UserInputNewName");
                }
                else
                {
                    ValidationResult = "Error, name must not be empty.";
                }
            }
        }
    
        private bool ValidateValue(string value)
        {
            return !string.IsNullOrWhiteSpace(value);
        }
    
        private string _ValidationResult;
    
        public string ValidationResult
        {
            get
            {
                return _ValidationResult ?? string.Empty;
            }
            set
            {
                _ValidationResult = value;
                OnPropertyChanged("ValidationResult");
            }
        }
    
        private EmployeeModel Model { get; set; }
    }
    
    public class EmployeeModel
    {
        public int EmployeeId { get; set; }
    
        public string EmployeName { get; set; }
    }
    
    说明:

  • 你有一个EmployeeModel,这是描述员工的真实模型。您的视图(例如带有用户输入字段的WPF窗口)不了解模型-模型和视图之间没有直接联系
  • 视图只知道有关视图模型的信息。假设这是一个允许您修改员工的掩码,那么我们将使用EmployeesEditViewModel进行修改。ViewModel公开视图所需的属性,在这个简单的例子中,它只是员工的姓名和验证结果(可以显示在另一个文本字段中)。当用户输入一个值时,您可以检查它是否有效,然后更新实际模型或告诉用户出了什么问题

  • 理想情况下,您可能在模型本身上有一些验证逻辑,并且让ViewModel仅将此结果转换为用户可以看到的内容。这将保留模型所属的所有责任(如验证),但您仍然拥有一个ViewModel,可以将其转换并转发到视图中。

    下面是一个代码示例:

    public class EmployeesEditViewModel : INotifyPropertyChanged
    {
        public string UserInputNewName
        {
            get
            {
                return Model.EmployeName;
            }
            set
            {
                if (ValidateValue(value))
                {
                    Model.EmployeName = value;
                    ValidationResult = string.Empty;
                    OnPropertyChanged("UserInputNewName");
                }
                else
                {
                    ValidationResult = "Error, name must not be empty.";
                }
            }
        }
    
        private bool ValidateValue(string value)
        {
            return !string.IsNullOrWhiteSpace(value);
        }
    
        private string _ValidationResult;
    
        public string ValidationResult
        {
            get
            {
                return _ValidationResult ?? string.Empty;
            }
            set
            {
                _ValidationResult = value;
                OnPropertyChanged("ValidationResult");
            }
        }
    
        private EmployeeModel Model { get; set; }
    }
    
    public class EmployeeModel
    {
        public int EmployeeId { get; set; }
    
        public string EmployeName { get; set; }
    }
    
    说明:

  • 你有一个EmployeeModel,这是描述员工的真实模型。您的视图(例如带有用户输入字段的WPF窗口)不了解模型-模型和视图之间没有直接联系
  • 视图只知道有关视图模型的信息。假设这是一个允许您修改员工的掩码,那么我们将使用EmployeesEditViewModel进行修改。ViewModel公开视图所需的属性,在这个简单的例子中,它只是员工的姓名和验证结果(可以显示在另一个文本字段中)。当用户输入一个值时,您可以检查它是否有效,然后更新实际模型或告诉用户出了什么问题

  • 理想情况下,您可能在模型本身上有一些验证逻辑,并且让ViewModel仅将此结果转换为用户可以看到的内容。这将保留模型所属的所有责任(如验证),但您仍然拥有一个ViewModel,可以将其转换并转发到视图中。

    下面是一个代码示例:

    public class EmployeesEditViewModel : INotifyPropertyChanged
    {
        public string UserInputNewName
        {
            get
            {
                return Model.EmployeName;
            }
            set
            {
                if (ValidateValue(value))
                {
                    Model.EmployeName = value;
                    ValidationResult = string.Empty;
                    OnPropertyChanged("UserInputNewName");
                }
                else
                {
                    ValidationResult = "Error, name must not be empty.";
                }
            }
        }
    
        private bool ValidateValue(string value)
        {
            return !string.IsNullOrWhiteSpace(value);
        }
    
        private string _ValidationResult;
    
        public string ValidationResult
        {
            get
            {
                return _ValidationResult ?? string.Empty;
            }
            set
            {
                _ValidationResult = value;
                OnPropertyChanged("ValidationResult");
            }
        }
    
        private EmployeeModel Model { get; set; }
    }
    
    public class EmployeeModel
    {
        public int EmployeeId { get; set; }
    
        public string EmployeName { get; set; }
    }
    
    说明:

  • 你有一个EmployeeModel,这是描述员工的真实模型。您的视图(例如带有用户输入字段的WPF窗口)不了解模型-模型和视图之间没有直接联系
  • 视图只知道有关视图模型的信息。假设这是一个允许您修改员工的掩码,那么我们将使用EmployeesEditViewModel进行修改。ViewModel公开视图所需的属性,在这个简单的例子中,它只是员工的姓名和验证结果(可以显示在另一个文本字段中)。当用户输入一个值时,您可以检查它是否有效,然后更新实际模型或告诉用户出了什么问题
  • 理想情况下,您可能在模型本身上有一些验证逻辑,并且让ViewModel仅将此结果转换为用户可以看到的内容。这将保留模型所属的所有责任(如验证)