【问题标题】:Refresh DataGrid after item property change项目属性更改后刷新 DataGrid
【发布时间】:2014-07-23 13:53:30
【问题描述】:

我的模型类是由实体框架从数据库中自动生成的,所以它们无法实现INotifyPropertyChanged。我的 XAML 中有这个:

<DataGrid ItemsSource={Binding CollectionView}/>

在充当DataContext的类中:

public ICollectionView CollectionView { get; set; }
private DbSet _data;

在它的构造函数中:

_data.Load();
CollectionView = CollectionViewSource.GetDefaultView(_data.Local);

应用程序的另一部分进行数据库更新,这会更改实体实例的一个属性。之后我打电话给

_data.Load();
CollectionView.Refresh();

但更新未出现在 DataGrid 中。 我该怎么办?

对我来说奇怪的是,我可以使用 _data.Load() 显示数据库插入,所以我的印象是这个调用完全重建了数据库中的 Local 集合。

【问题讨论】:

  • "我的模型类是 Entity Framework 从数据库中自动生成的,所以无法实现 INotifyPropertyChanged。"这不是真的,您可以修改生成类的 T4 模板并让它们实现 INPC。不说这是解决方案,只是说这是一个错误的陈述。 blogs.msdn.com/b/efdesign/archive/2009/01/22/…

标签: c# wpf entity-framework datagrid wpfdatagrid


【解决方案1】:

您必须编写实现 INotifyPropertyChanged 的 ViewModel 包装器,如 this 帖子中所述。

【讨论】:

  • 好的,但在某些情况下,我有 70 多个表,其中包含近 40 个属性。有没有办法简单地从数据库中重新加载 DataGrid 内容?
  • 如果您有大量记录,重新加载 DataGrid 将是一项昂贵的操作。例如如果您有一个包含 1 Cr 记录的表,并且您在记录中的单个字段中进行了更改,它将在 db 中更新,然后如果您想为这个小更改重新加载 DataGrid,您可能必须获取所有记录并再次将记录集与 DataGrid 绑定。此操作将花费大量时间,用户将不得不不必要地等待。
【解决方案2】:

您可能会导致集合每次都“反弹”。不过,正如 Nitin Joshi 所说,它可能很昂贵。

类似:

xaml:

<DataGrid ItemsSource={Binding CollectionView, UpdateSourceTrigger="PropertyChanged"}/>

代码:

private DbSet _data;

ICollectionView _collectionView;
public ICollectionView CollectionView 
{
    get { return _collectionView; }
    set
    {
        _collectionView = value;
        RaisePropertyChanged("CollectionView");
    }   
}

然后您可以简单地将 CollectionView 与新数据集“重新绑定”,而不是调用 Refresh()。

private void Update()
{
    _data.Load();
    CollectionView = null; // this will force a re-bind
    CollectionView = CollectionViewSource.GetDefaultView(_data.Local);  
}

【讨论】:

  • 这对我不起作用;即使将 CollectionView 设置为 null 并将其设置回并提高 PropertyChanged 两次,DataGrid 仍会显示旧数据。
  • 我收回;原来问题是修改数据库的视图和显示数据的视图正在使用同一个 DbContext 类的两个不同实例;用单例包裹它可以解决问题。
【解决方案3】:

原来问题在于修改数据库的视图和显示数据的视图使用了同一个 DbContext 类的两个不同实例;用单例包裹它可以解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-06
    • 2014-05-15
    • 2018-08-29
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多