MVVM使用命令混淆保存视图模型的更改
本文关键字:模型 视图 保存 命令 MVVM | 更新日期: 2023-09-27 18:19:10
我有一个GridView
显示ObservableCollection<Models>
。当我选择一个项目时,将填充TextBoxe
s以允许编辑和添加新的Model
s。但是,当我编辑文本框时,gridview和ViewModel会自动更新。我正试图使用按钮命令来保存/取消修订。
我已经包括了我的视图和我的ViewModel。我在这方面还是比较新的,我一直在遵循这个教程http://msdn.microsoft.com/en-us/library/ff798384.aspx,我不确定我可以改变什么,以使它按照我想要的方式工作。
当我去创建一个NewModel时,SelectedModel也随着NewModel改变。所以困惑!
我的观点:
<ListView ItemsSource="{Binding Models}" SelectedItem="{Binding SelectedModel}"
IsSynchronizedWithCurrentItem="True">
<ListView.View>
<GridView>
<GridViewColumn Header="Models" DisplayMemberBinding="{Binding ModelName}">
<GridViewColumn Header="Template"
DisplayMemberBinding="{Binding Template.TemplateID}">
</GridView>
</ListView.View>
</ListView>
<TextBox DataContext="{Binding SelectedModel}" Text="{Binding ModelName, Mode=TwoWay}"/>
<TextBox DataContext="{Binding SelectedModel}" Text="{Binding TemplateID, Mode=TwoWay}"/>
<Button Content="Save" Command="{Binding SaveModelCommand}" />
<Button Content="Cancel" Command="{Binding CancelModelCommand}" />
<Button Content="Add Model" Command="{Binding AddModelCommand}" />
我的视图模型:
private Model _selectedModel = null;
private Model _newModel = null;
private RelayCommand _addmodelcommand;
private RelayCommand _editmodelcommand;
private RelayCommand _savemodelcommand;
public Model SelectedModel
{
get { return _selectedModel; }
set
{
if (_selectedModel != value)
{
_selectedModel = value; RaisePropertyChanged("SelectedModel");
}
}
}
public Model NewModel
{
get { return _newModel; }
set
{
_newModel = value;
RaisePropertyChanged("NewModel");
}
}
public RelayCommand AddModelCommand
{
get
{
if (_addmodelcommand == null)
{
_addmodelcommand = new RelayCommand(p => SetNewModel(),
p => true);
}
return _addmodelcommand;
}
set
{
_addmodelcommand = value;
RaisePropertyChanged("AddModel");
}
}
public RelayCommand SaveModelCommand
{
get
{
if (_savemodelcommand == null)
{
_savemodelcommand = new RelayCommand(p => ModelSaved(),
p => true);
}
return _savemodelcommand;
}
set
{
_savemodelcommand = value;
RaisePropertyChanged("SaveModel");
}
}
public void SetNewModel()
{
if (NewModel == null)
{
NewModel = new Model();
}
else
{
NewModel.ModelName = string.Empty;
}
SelectedModel = NewModel;
}
public string ModelSaved()
{
string error = null;
if (error == null)
{
if (SelectedModel != NewModel)
{
UpdateModel(SelectedModel);
}
else //adds new model
{
//Add the new model to the data context.
_ESTContext.Models.Add(NewModel);
//Add the new model to the observable collection.
this.Models.Add(NewModel);
this.SelectedModel = NewModel;
NewModel = null;
}
_ESTContext.SaveChanges();
}
return error;
}
我注意到您正在使用EntityFramework,该框架旨在跟踪您的更改,并仅在调用_ESTContext.SaveChanges()
时保存它们。所以我会改变你处理这个问题的方式。
目前,似乎你想让用户在移动到ListView中的另一个项目之前单击保存或取消。我建议你让用户点击一个项目,使用你的文本框修改它,如果他们想,点击另一个项目并修改它。用户还可以根据需要多次点击添加按钮。然后,当他们完成了所有的更改,然后点击保存按钮应该简单地做任何错误检查的所有数据(如果你想),然后调用_ESTContext.SaveChanges()
。这将一次保存所有的更改。同样地,使取消按钮成为一个全局取消按钮,它可以像执行_ESTContext = new WhateverContext();
一样简单地实现,然后刷新您的Models
属性。
这种方法也允许用户在他们想要的时候点击保存按钮,所以理论上他们仍然可以在每次修改后保存,如果他们真的想要的话。