ObservableCollection <Entity>.Property не обновляет интерфейс после изменения - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть 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));
        }
    }
}

1 Ответ

0 голосов
/ 25 ноября 2018

Кэширование в Entity Framework до тех пор, пока вы не включите отслеживание изменений.

Если вы прочитаете данные таблицы, они изменятся в базе данных, а затем снова прочитаете содержимое этой таблицы, что даст вам то, что у нее в памятивместо того, чтобы возвращаться к базе данных.

Если вы хотите отслеживать изменения, то самый простой способ обойти это - избавиться от dbcontext и использовать новый.

Вы можете прочитать больше здесь:

http://codethug.com/2016/02/19/Entity-Framework-Cache-Busting/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...