gpt4 book ai didi

c# - ViewModel 的数据更改时,文本框不会更新

转载 作者:行者123 更新时间:2023-12-03 10:25:34 26 4
gpt4 key购买 nike

我已经实现了我的第一个 WPF MVVM 窗口。在加载窗口时,会调用从 Access 数据库中获取数据的方法,并且所有适当的文本框都绑定(bind)到 EmployeeModel 的属性。

我还有一个名为 Refresh 的按钮,它运行相同的方法从数据库中获取员工数据,出于测试目的,我让 Refresh 按钮获取不同的员工 ID。

但是,窗口的所有字段都不会随着新的 EmployeeModel 更新。我使用断点发现将新数据保存到 EmployeeModel 没有问题,但似乎没有文本框会用这些新数据进行更新。

按照在线指南,我使用了 INotifyProperyChanged 并在我的 View 中使用了 UpdateSourceTrigger。

员工型号

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
}

员工查看模型
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}"/>

最佳答案

您正在为一个新的模型对象更改整个模型,但您没有通知 UI 是您所做的。您的 EmployeeViewModel 类应该实现 INotifyPropertyChanged 就像您对员工模型所做的那样,然后属性 Employee 应该调用 OnPropertyChanged 方法

    private EmployeeModel _employee;
public EmployeeModel Employee {
get { return _employee; }
set {
if(_employee!=value) {
_employee=value;
OnPropertyChanged();
}
}
}

关于c# - ViewModel 的数据更改时,文本框不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56638443/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com