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,模型仍然没有更新。