【问题标题】:How to Update Model from the View如何从视图更新模型
【发布时间】:2013-01-02 12:01:27
【问题描述】:

我有模特班员工:

public class Employee   
{
    public string Id { get; set; }  
    public string Name { get; set; }  
    public string LastName { get; set; }            
}

并查看模型类EmployeeViewModel,其中包含Employee Object

public class EmployeeViewModel : INotifyPropertyChanged  
{  
    public EmployeeViewModel()
    {

    }            

    private Employee currentEmployee;

    public Employee CurrentEmployee
    {
        get { return this.currentEmployee; }

        set
        {
            this.currentEmployee = value;
            this.NotifyPropertyChanged("CurrentEmployee");
        }
    }

    //Some code .....
    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

        #endregion
}

现在视图 (WPF) 将使用视图模型中的Employee 对象作为ItemSource 来显示员工数据

现在的问题是:我在视图上有更新按钮,当我更改视图中的 Employee 属性时(通过文本框)我想更新模型(所以之后我可以更新数据库),如何从视图中更新此模型。

【问题讨论】:

  • 如果您使用绑定到 CurrentEmployee,数据应该通过绑定存在,考虑在模型中实现 INotifyPropertyChanged,您知道如何获取按钮的命令(又名 ICommand)吗?分享 xaml 以获得更好的答案

标签: wpf mvvm inotifypropertychanged itemsource


【解决方案1】:

当我检查你的模型类时有一些奇怪的地方。它应该实现 INotifyPropertyChanged 然后为每个属性创建支持字段,就像这样。

模型类

public class Employee:INotifyPropertyChanged
    {
        private string _name;
        public string Name
        {
            get
            {
                return _name;
            }
            set
            {
                _name= value;
                OnPropertyChanged("Name");
            }

        }
          #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion

    }

**ViewModel Class**

 class EmployeeViewModel 
    {
        private IList<Employee> _employees;
        public EmployeeViewModel()
        {
            _employees= new List<Employee>
            {
                new Employee{ID=1, Name ="Emp1"},
                new Employee{ID=2, Name="Emp2"}
            };


        }

        public IList<Employee> Employees
        {
            get
            {
                return _employees;
            }
            set
            {
                _employees= value;
            }
        }

        private ICommand mUpdater;
        public ICommand UpdateCommand
        {
            get
            {
                if (mUpdater == null)
                    mUpdater = new Updater();
                return mUpdater;
            }
            set
            {
                mUpdater = value;
            }
        }

        private class Updater : ICommand
        {
            #region ICommand Members

            public bool CanExecute(object parameter)
            {
                return true;
            }

            public event EventHandler CanExecuteChanged;

            public void Execute(object parameter)
            {

            }

            #endregion
        }

    }

您可以将您的逻辑放在 OnPropertyChanged 事件中。每当您在 UI 上进行更改时,都会调用此方法

【讨论】:

  • 非常感谢您的跟进。首先,我想在这一点上使用遵循 DDD 的干净模型。其次,我为了解决问题而应用了这个解决方案,但即使在模型和视图模型中都实现了 INotifyPropertyChanged 之后,模型也始终没有更新。
【解决方案2】:

如果您使用的是ObservableCollection,则通过根据 ID 搜索项目来修改您的List,然后如果找到,请修改值。如果 UI 项绑定到您的 ObservableCollection,您所做的任何更改都会自动影响它们,然后使用修改后的集合来更新您的数据库记录

【讨论】:

  • 但是视图一次显示一个员工的详细信息,然后在视图中我需要修改一些员工属性,比如姓名,然后我希望员工模型能够捕捉到这个变化,这样我就可以使用将更改提交到数据库的存储库
猜你喜欢
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 2022-08-03
相关资源
最近更新 更多