【问题标题】:WPF: EF to ObservableCollection and DataGrid auto-update: a definitive solutionWPF:EF 到 ObservableCollection 和 DataGrid 自动更新:最终解决方案
【发布时间】:2014-06-06 15:51:24
【问题描述】:

我对 WPF 和 MVVM 模型相对较新,但是经过数小时搜索和阅读有关此事的文章后,我还没有提出明确的解决方案。

1) 模型:我有一个依赖于 SQL Express 数据库的 EF 模型。对于此示例,我将使用名为 Visits 的属性,即 DbSet(Of Visit)。

2) ViewModel:一个 ObservableCollection(Of Visit)。它是这样声明的:

Private _Visits As ObservableCollection(Of Visit)
Public Property Visits As ObservableCollection(Of Visit)
    Get
        Return _Visits
    End Get
    Set(value As ObservableCollection(Of Visit))
        _Visits = value
        RaisePropertyChanged("Visits")
    End Set
End Property
...
Visits = New ObservableCollection(Of Visit)(
    From V In Application.context.Visits
    Where V.IsRobotGenerated AndAlso
    Not V.IsSynced
)

3) 视图:WPF 数据网格。

<DataGrid
    x:Name="grdVisits"
    ItemsSource="{
        Binding Path=Visits,
        RelativeSource={RelativeSource FindAncestor, AncestorType=Window}
    }"
/>

现在我有一个后台线程,它直接修改 EF 数据(执行所有 CRUD 操作)。 我想要的是数据网格来反映这些变化。

我现在正在做的是通过重新调用上面的构造函数来替换 Visits ObservableCollection,这会导致两个缺点:

1) 在性能方面,我认为这不是最佳选择,尤其是当我们谈论数千行(每行都有其 RowDetails)时。

2) 用户同时向下滚动了数据网格或打开了 RowDetailsTemplate。如果重置整个收藏,他的位置和一切都将丢失。

我在某处读过有关 DependencyProperties 的文章,但我没有时间仔细阅读它,因为我不知道它是否是指向正确方向的指针。如果是,我会很乐意这样做。

任何帮助将不胜感激。

【问题讨论】:

    标签: wpf entity-framework wpfdatagrid observablecollection auto-update


    【解决方案1】:

    当您在绑定到 ItemsSourceObservableCollection 中添加或删除元素时,这些更改会立即反映,因此您只需在进行 CRUD 操作时相应地修改 ObservableCollection

    请记住,如果您使用的是 .NET 4.5 之前的版本,则需要将 ObservableCollection 更改发送到 UI 线程。

    更新:回复评论

    下面的场景呢:视图中有两个数据网格,它们绑定到两个不同的 ObservableCollections。但是,这些 ObservableCollections 是使用不同的构造函数创建的,以便对基础访问应用过滤。您能否提供一个简单的示例来说明我如何完成上述操作?

    过滤是另一回事。它由集合和项目控件之间的中间层集支持(在这种情况下分别为ObservableCollectionDataGrid):集合视图。其实you always bind to collection views, not to the collections directly

    因此,对于您的方案,您需要将两个 DataGrids 绑定到同一个底层集合,但使用两个不同的集合视图,每个 DataGrid 一个。这样,数据将保持不变并与您需要的任何内容同步(例如,您的 CRUD 操作)。但是,每个DataGrid 都可以根据过滤、排序和/或以不同方式分组来显示数据的子集。

    我建议你看看MSDN article regarding data binding to collections

    【讨论】:

    • 据我所知,我的 CRUD 线程必须与 ViewModel 对话,而 ViewModel 会反过来更新模型,而不是模型本身。
    • 下面的场景呢:视图中有两个数据网格,分别绑定了两个不同的 ObservableCollections。但是,这些 ObservableCollections 是使用不同的构造函数创建的,以便对基础访问应用过滤。你能提供一个简单的例子来说明我如何完成上述工作吗?
    • 嗯,这取决于您的实现的复杂性。您实际上可以使用触发 CRUD 操作的命令和通知其成功的事件并修改 ObservableCollection;甚至使用服务层这样做。关于您的问题,我认为重要的是您意识到保持DataGrid 同步所需的是通过修改其绑定ObservableCollection 来反映更改,而不是重新创建它。
    • @GeorgeGkionis 我已更新答案以回答您评论中的问题。
    • 非常感谢。我想我需要进行重大重构以遵守此架构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 2016-11-01
    相关资源
    最近更新 更多