我有GridView
显示ObservableCollection<Models>
。当我选择一个项目时,会填充TextBoxe
以允许编辑和添加新的Model
。但是,当我编辑文本框时,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}" />
我的ViewModel:
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;
}
答案 0 :(得分:1)
我注意到您正在使用EntityFramework,它旨在跟踪您的更改,并仅在您致电_ESTContext.SaveChanges()
时保存更改。所以我会改变你接近这个的方式。
目前,您似乎想让用户点击保存或取消,然后再转到ListView中的其他项目。我建议你让用户点击一个项目,使用你的文本框修改它,如果需要,点击另一个项目并修改它。用户还可以根据需要多次单击“添加”按钮。然后,当他们完成所有更改后,单击“保存”按钮应该只对所有数据执行任何错误检查(如果需要),然后调用_ESTContext.SaveChanges()
。这将立即保存所有更改。同样,将取消按钮设为全局取消按钮,可以像执行_ESTContext = new WhateverContext();
一样简单实现,然后刷新Models
属性。
这种方法还允许用户随时点击“保存”按钮,这样理论上他们理所当然可以在每次修改后保存,如果他们真的想要的话。