Wpf 如何从视图更新模型

Wpf 如何从视图更新模型,wpf,mvvm,inotifypropertychanged,itemsource,Wpf,Mvvm,Inotifypropertychanged,Itemsource,我有模范班员工: public class Employee { public string Id { get; set; } public string Name { get; set; } public string LastName { get; set; } } 和视图模型类EmployeeViewModel,其中包含Employee对象 public class EmployeeViewModel : INotifyPro

我有模范班员工:

public class Employee   
{
    public string Id { get; set; }  
    public string Name { get; set; }  
    public string LastName { get; set; }            
}
和视图模型类
EmployeeViewModel
,其中包含
Employee对象

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
属性(通过文本框)时,我想更新模型(以便之后可以更新数据库),如何从视图中更新此模型。

如果您使用的是
ObservableCollection
通过基于ID搜索项目来修改您的
列表
,然后如果找到,则修改值。如果UI项绑定到您的
ObservableCollection
,则您所做的任何更改都将自动影响UI项,然后使用修改后的集合更新您的DB记录,因为我在那里检查了您的模型类的一些奇怪之处。它应该实现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
        }

    }
公共类员工:INotifyPropertyChanged
{
私有字符串\u名称;
公共字符串名
{
得到
{
返回_name;
}
设置
{
_名称=值;
不动产变更(“名称”);
}
}
#区域INotifyProperty更改成员
公共事件属性更改事件处理程序属性更改;
私有void OnPropertyChanged(字符串propertyName)
{
if(PropertyChanged!=null)
{
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
}
#端区
}
**ViewModel类**
类EmployeeViewModel
{
私营IList_员工;
公共雇员视图模型()
{
_雇员=新名单
{
新员工{ID=1,Name=“Emp1”},
新员工{ID=2,Name=“Emp2”}
};
}
公务员
{
得到
{
返回(u)员工;;
}
设置
{
_员工=价值;
}
}
私人ICommand mUpdater;
公共ICommand更新命令
{
得到
{
if(mUpdater==null)
mUpdater=新的更新程序();
返回mUpdater;
}
设置
{
mUpdater=值;
}
}
私有类更新程序:ICommand
{
#区域ICommand成员
公共布尔CanExecute(对象参数)
{
返回true;
}
公共事件处理程序CanExecuteChanged;
public void Execute(对象参数)
{
}
#端区
}
}

您可以将逻辑放在PropertyChanged事件中。每当您在UI上进行更改时,总是调用这个方法。如果您使用绑定到CurrWorkEngress,数据应该通过绑定在那里,考虑在模型中实现IntIfyPrimyType,您知道如何获得按钮的命令(Aka ICOMMand)吗??共享xaml以获得更好的回答,但视图一次显示一名员工的详细信息,然后在视图中,我需要修改一些employee属性,比如name,然后我希望employee模型能够捕捉到这个更改,这样我就可以使用repository将更改提交到数据库中,非常感谢您的后续工作。首先,我想在DDD之后使用clean模型。其次,为了解决这个问题,我应用了这个解决方案,但是即使在模型和视图模型中都实现了INotifyPropertyChanged,模型仍然没有更新。