У меня есть 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
, а также обновитьИдентификаторы этих элементов, так что нет пробелов (идентификаторы должны читаться как 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
обновляет все в дБ,но пользовательский интерфейс остается прежним (например, если я удаляю элемент 2, идентификаторы читаются как 1, 3, 4 ...).
Как вы можете видеть, я пытался добавить INotifyPropertyChanged
кObersvableCollection
, но это не сработало.
Я думаю, что, вероятно, я могу добавить это к свойству ConsignmentId
в самой модели, но я не думаю, что этожелательно?
Я даже воссоздаю коллекцию прямо с БД, но почему-то она все равно не работает .. даже после перехода на разные страницы и возвращения назад
Другой вариант - обернуть Consignment
в ConsignmentViewModel
объект - с которым у меня раньше был некоторый успех - но я понимаю, что после MVVM я должен просто манипулировать Consignment
заманивает себя из ВМ?(поскольку использование дополнительных виртуальных машин в PageConsignmentsViewModel
означало бы, что я использую 2 модели представления для одного представления)
Буду очень признателен, если кто-нибудь сможет предоставить предложение
Commands.RemoveConsignment ()
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();
}
}
Consignment.cs
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));
}
}
}