C# MVVM使用命令保存对viewmodel的更改
我有一个C# MVVM使用命令保存对viewmodel的更改,c#,wpf,entity-framework,mvvm,C#,Wpf,Entity Framework,Mvvm,我有一个网格视图显示一个可观察的集合。当我选择一个项目时,将填充文本框s,以允许编辑和添加新的模型s。但是,当我编辑文本框时,gridview和ViewModel会随着修订自动更新。我尝试使用按钮命令来保存/取消修订 我已经包括了我的视图和视图模型。我在这方面还是比较新的,我一直在学习这个教程,我不确定我能做些什么来让它按照我想要的方式工作 当我去创建一个新模型时,SelectedModel也会随着新模型而改变。真糊涂 我的看法是: <ListView ItemsSource="{Bind
网格视图
显示一个可观察的集合
。当我选择一个项目时,将填充文本框
s,以允许编辑和添加新的模型
s。但是,当我编辑文本框时,gridview和ViewModel会随着修订自动更新。我尝试使用按钮命令来保存/取消修订
我已经包括了我的视图和视图模型。我在这方面还是比较新的,我一直在学习这个教程,我不确定我能做些什么来让它按照我想要的方式工作
当我去创建一个新模型时,SelectedModel也会随着新模型而改变。真糊涂
我的看法是:
<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}" />
我注意到您正在使用EntityFramework,它旨在跟踪您的更改,并且仅在您调用
\ESTContext.SaveChanges()
时保存更改。所以我会改变你处理这件事的方式
目前,您似乎想让用户在转到ListView中的其他项目之前单击“保存”或“取消”。我建议您让用户单击一个项目,使用文本框修改它,如果他们愿意,单击另一个项目并修改该项目。用户还可以根据需要多次单击“添加”按钮。然后,在完成所有更改后,单击“保存”按钮只需对所有数据执行任何错误检查(如果需要),然后调用\est context.SaveChanges()
。这将一次保存所有更改。类似地,将cancel按钮设置为全局取消按钮,可以像执行\u ESTContext=new WhateverContext()一样实现
然后刷新您的模型
属性
这种方法还允许用户随时单击“保存”按钮,这样,理论上,如果用户确实愿意,每次修改后都可以保存。您无需通知从未更改的属性的更改。这包括返回命令的属性,您可以延迟初始化它们,setter是多余的。
ListView
不推荐使用,而是使用DataGrid
和CanUserAddRows=“True”
,它应该以最少的开发完成这项工作。Hmmm。我懂了。我注意到了这一点,但是如果我想允许用户一次编辑/添加一个呢?我是否可以在viewmodel中创建一个新的模型对象,并在单击“保存”时将其插入主viewmodel?但这仅适用于新模型,因为您必须将文本框绑定到AddedModel
属性。这样做有什么不对?那么,您将如何修改现有的模型
?您必须有两组文本框,因为每个文本框只能有一个绑定。根据您的评论,使用DataGrid而不是ListView最有好处。查看这个关于datagrids的超级简单教程:这是第3部分的第一部分。我明白了,第二部分和第三部分对你最有用。谢谢你的洞察力。谢谢。我正在考虑打开一个对话框,将值传入和传出。我会尝试一下,如果不可能,我想我只能坚持你的建议。
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;
}