我有这个DataGrid
:
<DataGrid ItemsSource="{Binding Consignments}"
SelectedItem="{Binding SelectedConsignment}"
x:Name="dataGridConsignments"
Margin="10,47,10,9.6"
IsReadOnly="True" ColumnWidth="*" AutoGenerateColumns="False"
clr:Commands.DataGridDoubleClickCommand="{Binding DataGridDoubleClick}">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding ConsignmentId,UpdateSourceTrigger=PropertyChanged}"></DataGridTextColumn>
<DataGridTextColumn Header="Created" Binding="{Binding CreatedDate}"></DataGridTextColumn>
<DataGridTextColumn Header="Weight" Binding="{Binding TotalWeight, StringFormat=N2}"></DataGridTextColumn>
</DataGrid.Columns>
在我的ViewModel
中:
private ObservableCollection<Consignment> consignments;
public ObservableCollection<Consignment> Consignments { get { return consignments; } set { consignments = value; OnPropertyChanged("Consignments"); } }
现在,我想从DataGrid
中删除一个项目,并更新这些项目的ID,以使它们之间没有空隙(ID应该读为1,2,3,4 ...),所以我有该命令:
private ICommand removeConsignment;
public ICommand RemoveConsignment
{
get
{
return removeConsignment
?? (removeConsignment = new ActionCommand(() =>
{
var c = SelectedConsignment;
StandardDatabase.Commands.RemoveConsignment(c.Id);
Consignments = new ObservableCollection<Consignment>(db.Consignments.ToList());
}));
}
}
Commands.RemoveConsignment
更新db中的所有内容,但UI保持不变(例如,如果我删除项目2,则ID读取为1、3、4 ...)。
如您所见,我尝试将INotifyPropertyChanged
添加到ObersvableCollection
本身,但这没有用。
我想我可以将其添加到模型本身的ConsignmentId
属性中,但是我认为这不建议吗?
我什至直接从Db重新创建了集合,但是无论如何它仍然无法正常工作..即使导航到不同的页面并返回
另一种选择是将Consignment
包装在一个ConsignmentViewModel
对象中-我以前曾经取得过一些成功-但我的理解是,跟随MVVM之后,我应该只操作{ {1}}是否从VM自身构成? (因为在Consignment
中使用更多的VM意味着我在一个视图中使用2个视图模型)
如果有人可以提出建议,我将非常感谢
Commands.RemoveConsignment()
PageConsignmentsViewModel
Consignment.cs
public static void RemoveConsignment(int id)
{
using (var db = new ApplicationDbContext())
{
var consignment = db.Consignments.SingleOrDefault(p => p.Id == id);
db.Consignments.Remove(consignment);
// Reset consignmentIds
for (int i = consignment.ConsignmentId ; i < db.Consignments.Count(); i++)
{
var c = db.Consignments.SingleOrDefault(x => x.ConsignmentId == i + 1);
c.ConsignmentId = c.ConsignmentId - 1;
db.Entry(c).CurrentValues.SetValues(c);
}
db.SaveChanges();
}
}
答案 0 :(得分:0)
实体框架缓存,除非您进行变更跟踪。
如果读取了表中的数据,则会在数据库中对其进行更改,然后再次读取该表中的内容,它将为您提供表中的内存,而不是返回数据库。
如果您要进行更改跟踪,那么最简单的方法是处理dbcontext并使用一个新的dbcontext。
您可以在这里阅读更多内容:
http://codethug.com/2016/02/19/Entity-Framework-Cache-Busting/