代码之家  ›  专栏  ›  技术社区  ›  Bassie

ObservableCollection<Entity>。属性在更改后不更新UI

  •  0
  • Bassie  · 技术社区  · 7 年前

    我有这个 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));
            }
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Andy    7 年前

    实体框架缓存,除非您打开更改跟踪。

    如果您读取了一个表的数据,它在数据库中会被更改,然后您再次读取该表的内容,它将提供内存中的内容,而不是返回数据库。

    您可以在此处阅读更多内容:

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