Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 项目属性更改后刷新DataGrid_C#_Wpf_Entity Framework_Datagrid_Wpfdatagrid - Fatal编程技术网

C# 项目属性更改后刷新DataGrid

C# 项目属性更改后刷新DataGrid,c#,wpf,entity-framework,datagrid,wpfdatagrid,C#,Wpf,Entity Framework,Datagrid,Wpfdatagrid,我的模型类是通过实体框架从数据库自动生成的,因此它们无法实现INotifyPropertyChanged。我的XAML中有以下内容: <DataGrid ItemsSource={Binding CollectionView}/> 在其构造中: _data.Load(); CollectionView = CollectionViewSource.GetDefaultView(_data.Local); 应用程序的另一部分进行数据库更新,从而更改实体实例的一个属性。之后我打电话

我的模型类是通过实体框架从数据库自动生成的,因此它们无法实现
INotifyPropertyChanged
。我的XAML中有以下内容:

<DataGrid ItemsSource={Binding CollectionView}/>
在其构造中:

_data.Load();
CollectionView = CollectionViewSource.GetDefaultView(_data.Local);
应用程序的另一部分进行数据库更新,从而更改实体实例的一个属性。之后我打电话

_data.Load();
CollectionView.Refresh();
但是更新不会出现在DataGrid中我该怎么办?


让我感到奇怪的是,我可以用
\u data.Load()显示数据库插入
因此我得到的印象是,这个调用完全从数据库中重建了
本地
集合。

您必须编写ViewModel包装器,实现
INotifyPropertyChanged
,如本文所述。

您可以使集合每次都“反弹”。不过,正如尼廷·乔希(Nitin Joshi)所说,这可能很昂贵

比如:

xaml:

然后,不用调用Refresh(),只需将CollectionView与新数据集“重新绑定”

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

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

“我的模型类是通过实体框架从数据库自动生成的,因此它们无法实现INotifyPropertyChanged。”这不是真的,您可以修改生成类的T4模板,并让它们实现INPC。不是说这是解决办法,只是说这是一个错误的说法。好的,但我有70多个表,在某些情况下有近40个属性。没有办法简单地从数据库重新加载DataGrid内容吗?如果您有大量记录,重新加载DataGrid将是一项昂贵的操作。e、 g.如果您有一个包含1个Cr记录的表,并且如果您在记录中的单个字段中进行了更改,则该表将在数据库中进行更新,然后如果您希望为这一小更改重新加载DataGrid,则您可能必须获取所有记录并再次将记录集与DataGrid绑定。此操作将花费大量时间,用户将不得不等待不必要的时间;即使在将
CollectionView
设置为null并将其设置回零并同时引发
PropertyChanged
后,DataGrid仍然显示旧数据;问题是修改数据库的视图和显示数据的视图使用了同一DbContext类的两个不同实例;用一个单件包装它解决了这个问题。
<DataGrid ItemsSource={Binding CollectionView, UpdateSourceTrigger="PropertyChanged"}/>
private DbSet _data;

ICollectionView _collectionView;
public ICollectionView CollectionView 
{
    get { return _collectionView; }
    set
    {
        _collectionView = value;
        RaisePropertyChanged("CollectionView");
    }   
}
private void Update()
{
    _data.Load();
    CollectionView = null; // this will force a re-bind
    CollectionView = CollectionViewSource.GetDefaultView(_data.Local);  
}