我已经实现了我的第一个WPF MVVM窗口。加载窗口时,会调用一个方法,该方法将从Access数据库中获取数据,并且所有适当的文本框都绑定到EmployeeModel的属性。
我还有一个名为“刷新”的按钮,该按钮运行相同的方法从数据库中获取Employee数据,出于测试目的,我使“刷新”按钮获取了不同的员工ID。
但是,窗口的任何字段都不会使用新的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");
}
}
查看
<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}"/>
答案 0 :(得分:2)
您正在为一个新的Model对象更改整个Model,但是没有通知UI您已完成此操作。您的EmployeeViewModel类应该像处理雇员模型那样实现INotifyPropertyChanged,然后属性Employee应该调用OnPropertyChanged方法
private EmployeeModel _employee;
public EmployeeModel Employee {
get { return _employee; }
set {
if(_employee!=value) {
_employee=value;
OnPropertyChanged();
}
}
}