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

我还有一个名为“刷新”的按钮,该按钮运行相同的方法从数据库中获取Employee数据,出于测试目的,我使“刷新”按钮获取了一个不同的员工ID。

但是,窗口的任何字段都不会使用新的EmployeeModel更新。我已经使用断点来发现将新数据保存到EmployeeModel中没有问题,但是似乎没有文本框会使用此新数据进行更新。

遵循在线指南,我在 View 中使用了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}"/>

最佳答案

您正在为一个新的Model对象更改整个Model,但没有通知UI您已完成该操作。您的EmployeeViewModel类应该实现INotifyPropertyChanged,就像处理Employee模型一样,然后属性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/

10-11 02:20
查看更多