项目属性更改后刷新DataGrid

时间:2014-07-23 13:53:31

标签: c# wpf entity-framework datagrid wpfdatagrid

我的模型类是由Entity Framework自动从数据库生成的,因此无法实现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集合。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

你可以让收藏品得到反弹&#39;每次。虽然如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");
    }   
}

然后您可以简单地重新绑定&#39;而不是调用Refresh()。具有新数据集的CollectionView。

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

答案 2 :(得分:0)

事实证明问题是修改数据库的视图和显示数据的视图使用了同一个DbContext类的两个不同实例;用单例包装它解决了问题。