У меня есть окно WPF, которое позволяет пользователю редактировать дату рождения сотрудника, в этом окне также есть текстовое поле для отображения возраста из введенного DoB.
Текстовое поле DoB связано смое свойство EmployeeModel Dob
Текстовое поле Age привязано к моему свойству EmployeeModel Age и не может быть установлено, а значение get используется с использованием значения Dob.
Проблема, с которой я сталкиваюсь, заключается в изменении пользователяDoB, текстовое поле Age не обновляется.
Я обнаружил, что если я реализую INotifyPropertyChanged
в моем EmployeeModel и добавлю OnPropertyChanged("Age")
в свойство Dob, то значение Age будет обновлено.Но это идет вразрез с тем, что мне советовали, что мои Модели должны быть только бизнес-логикой и не должны реализовывать INotifyPropertyChanged.
Как мне установить это так, чтобы Age обновлялся, когда DoB изменяется без изменения Модели?
EmployeeModel
class EmployeeModel
{
public DateTime? Dob { get => _dob; set => _dob = value; }
public int Age
{
get
{
if (_dob == null)
return 0;
DateTime now = DateTime.Today;
int age = now.Year - _dob.Value.Year;
if (now < _dob.Value.AddYears(age))
age--;
return age;
}
}
}
EmployeeViewModel
class EmployeeViewModel : INotifyPropertyChanged
{
private EmployeeModel _employee;
public EmployeeModel Employee
{
get => _employee;
set
{
if (_employee != value)
{
_employee = value;
OnPropertyChanged();
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([System.Runtime.CompilerServices.CallerMemberName]string caller = null)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(caller));
}
Просмотр
<Label Content="DOB" />
<DatePicker SelectedDate="{Binding Employee.Dob, TargetNullValue=''}" />
<Label Content="Age" />
<TextBox Text="{Binding Employee.Age, Mode=OneWay}" />