Я реализовал свое первое окно 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}"/>