我有这个
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"); } }
数据网格
并更新这些项目的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
属性,但我不认为这是可取的?
-
我甚至直接从数据库重新创建了这个集合,但不知怎么的,它仍然不起作用。。即使在浏览到不同的页面并返回
-
另一种选择是包装
Consignment
在一个
ConsignmentViewModel
对象—我以前在这方面已经取得了一些成功—但我的理解是,遵循MVVM之后,我应该只操纵
托运
PageConsignmentsViewModel
如果有人能提供建议,我将不胜感激
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();
}
}
public class Consignment : EntityBase
{
public virtual Order Order { get; set; }
public virtual ICollection<Package> Packages { get; set; }
public virtual int ConsignmentId { get; set; }
public Consignment()
{
Packages = new HashSet<Package>();
}
[NotMapped]
public double TotalWeight
{
get
{
return Packages.ToList().Sum(p => p.PartQuantities.Sum(pq => pq.UnitWeight * pq.Quantity));
}
}
}