WPF Bound TextBox значение не обновляется при изменении другого TextBox - PullRequest
0 голосов
/ 19 июня 2019

У меня есть окно 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}" />

1 Ответ

0 голосов
/ 19 июня 2019

Если вы не хотите реализовывать INotifyPropertyChanged в EmployeeModel, вам следует привязывать не свойство EmployeeModel, а свойство свойства представления, которое оборачивает свойство в EmployeeModel, например:

class EmployeeViewModel : INotifyPropertyChanged
{
    private EmployeeModel _employee;

    public DateTime? Dob
    {
        get { return _employee.Dob; }
        set { _employee.Dob = value; OnPropertyChanged(); OnPropertyChanged(nameof(Age)); }
    }

    public int Age
    {
        get { return _employee.Age; }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged([System.Runtime.CompilerServices.CallerMemberName]string caller = null)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(caller));
    }
}

XAML:

<Label Content="DOB" />
<DatePicker SelectedDate="{Binding Dob, TargetNullValue=''}" />
<Label Content="Age" />
<TextBox Text="{Binding Age, Mode=OneWay}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...