当ViewModel的数据更改时,文本框不会更新

时间:2019-06-17 20:24:40

标签: c# wpf xaml mvvm

我已经实现了我的第一个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}"/>

1 个答案:

答案 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();
            }
         }
    }