Текстовые поля не обновляются при изменении данных ViewModel - PullRequest
1 голос
/ 17 июня 2019

Я реализовал свое первое окно WPF MVVM. При загрузке окна вызывается метод, который выбирает данные из базы данных Access, и все соответствующие текстовые поля привязываются к свойствам EmployeeModel.

У меня также есть кнопка Refresh, которая запускает тот же метод для извлечения данных Employee из базы данных, для целей тестирования я сделал кнопку Refresh для получения другого идентификатора сотрудника.

Однако ни одно из полей окна не обновляется с новым EmployeeModel. Я использовал точки останова, чтобы найти, что нет проблем с сохранением новых данных в EmployeeModel, но текстовое поле, по-видимому, не будет обновлено этими новыми данными.

Следуя инструкциям в Интернете, я использовал INotifyProperyChanged и использую UpdateSourceTrigger, на мой взгляд.

EmployeeModel

class EmployeeModel : MyDbConnector, INotifyPropertyChanged
{
    private int _employeeId;
    private string _firstname;

    public int EmployeeId
    {
        get => _employeeId;
        set
        {
            if (_employeeId != value)
            {
                _employeeId = value;
                OnPropertyChanged();
            }
        }
    }

    public string Firstname
    {
        get => _firstname;
        set
        {
            if (_firstname != value)
            {
                _firstname = value;
                OnPropertyChanged();
            }
        }
    }

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

    public static EmployeeModel FindById(int id)
    {
        //code omitted
    }

EmployeeViewModel

class EmployeeViewModel
{
    public EmployeeModel Employee { get; set; }

    public EmployeeViewModel()
    {
        LoadEmployee(100);
    }

    public bool LoadEmployee(int employeeId)
    {
        if (!DbConnector.OpenDB())
            return false;

        Employee = EmployeeModel.FindById(employeeId);

        DbConnector.CloseDB();

        if (Employee == null)
            return false;

        return true;
    }

    public void Refresh()
    {
        // Load a different employee
        if (!LoadEmployee(102))
            MessageBox.Show("An error has occurred");
    }
}

View

<Label Width="100" Content="Employee ID"/>
<TextBox Width="100" IsEnabled="False" Text="{Binding Employee.EmployeeId, UpdateSourceTrigger=PropertyChanged}"/>
<Label Width="100" Content="First name"/>
<TextBox Text="{Binding Employee.Firstname, TargetNullValue='', UpdateSourceTrigger=PropertyChanged}"/>

1 Ответ

2 голосов
/ 18 июня 2019

Вы изменяете всю модель для нового объекта модели, но не уведомляете пользовательский интерфейс о том, что сделали это.Ваш класс EmployeeViewModel должен реализовывать INotifyPropertyChanged так же, как вы делали это с моделью сотрудника, а затем свойство Employee должно вызывать метод OnPropertyChanged

    private EmployeeModel _employee;
    public EmployeeModel Employee {
        get { return _employee; }
        set {
            if(_employee!=value) {
                _employee=value;
                OnPropertyChanged();
            }
         }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...