ObservableCollection <entity>。更改后属性不会更新UI

时间:2018-11-25 14:41:05

标签: c# wpf

我有这个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();
    }
}

1 个答案:

答案 0 :(得分:0)

实体框架缓存,除非您进行变更跟踪。

如果读取了表中的数据,则会在数据库中对其进行更改,然后再次读取该表中的内容,它将为您提供表中的内存,而不是返回数据库。

如果您要进行更改跟踪,那么最简单的方法是处理dbcontext并使用一个新的dbcontext。

您可以在这里阅读更多内容:

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