我已将Entity对象绑定到我的UI(WPF
),一个Edit People窗口,当我更改任何阵营并单击按钮Save时,它会将其保存在我的数据库中,关闭窗口并更新listPeople( DataGrid
),在我的保存按钮中只有休闲代码(db是我的DbContext
)
private void Inserir_Click(object sender, RoutedEventArgs e)
{
try
{
db.Peoples.Add(people);
db.SaveChanges();
MessageBox.Show("Register saved");
this.Close();
}
catch { }
}
这是有效的,但我有一个问题,当我更改任何阵营并单击关闭按钮时,它不会保存在DB中,但我的更改已更新为listPeople 单击关闭按钮时我需要,我的DbContext将所有值重置为原始值(如果编辑,添加或删除,请将其撤消)
关闭按钮事件
private void btClose_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
PeopleEdit.Closed事件
private void listPeople_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
if (listPeople.SelectedItem == null)
return;
Dados.People p = listPeople.SelectedItem as Dados.People;
EditPeopleep = new EditPeople(p);
ep.Closed += (s, arg) => { listPeople.ItemsSource = db.Peoples.ToList(); };
ep.ShowDialog();
}
答案 0 :(得分:1)
不要在对话框中编辑Person。获取副本并进行编辑。
如果用户单击“确定”,则保存更改。
var p = listPeople.SelectedItem as Dados.People;
var vm = new PersonViewModel{Name = p.Name, Tel=p.Tel};
var ep = new EditPeople(vm);
if(ep.ShowDialog()){
p.Name = vm.Name;
p.Tel = vm.Tel;
db.SaveChanges();
}
对于创建人,
var vm = new PersonViewModel{Name = "name", Tel="tel"};
var ep = new EditPeople(vm);
if(ep.ShowDialog()){
var p = new Dados.People();
p.Name = vm.Name;
p.Tel = vm.Tel;
db.Peoples.Add(p);
db.SaveChanges();
}
可以使用Undo-Redo系统,但这非常复杂。
你应该使PersonViewModel实现INotifyPropertyChanged,然后你可以在对话框中绑定它。
public class PersonViewModel:INotifyPropertyChanged
{
private string _name;
public string Name{ get{return _name;}
set{ SetProperty(ref _name, value);}}
private string _tel;
public string Tel{ get{return _tel;}
set{ SetProperty(ref _tel, value);}}
public PropertyChangedEventHandler PropertyChanged;
private void SetProperty<T>(ref T field, T value,
[CallerMemberName] string name = ""){
field = value;
if(PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
如果ViewModel中有许多属性,请使用Automapper复制它们。