gpt4 book ai didi

wpf - 将 Entity Framework 与 WPF 数据绑定(bind)结合使用的最佳实践

转载 作者:行者123 更新时间:2023-12-03 06:00:30 28 4
gpt4 key购买 nike

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

7年前关闭。




Improve this question




我正在构建我的第一个真正的 WPF 应用程序(即第一个打算供除我之外的人使用的应用程序),并且我仍在思考在 WPF 中做事的最佳方式。这是一个使用仍然相当新的 Entity Framework 的相当简单的数据访问应用程序,但我无法在网上找到大量指南,以了解将这两种技术(WPF 和 EF)结合使用的最佳方式。所以我想我会扔掉我是如何接近它的,看看是否有人有更好的建议。

  • 我在 SQL Server 2008 中使用 Entity Framework 。 EF 给我的印象是比它需要的复杂得多,而且还不成熟,但是 Linq-to-SQL 显然已经死了,所以我不妨使用该技术那个 MS 似乎正在关注。
  • 这是一个简单的应用程序,所以我还没有(还)认为适合围绕它构建一个单独的数据层。当我想获取数据时,我使用相当简单的 Linq-to-Entity 查询,通常直接来自我的代码隐藏,例如:
    var families = from family in entities.Family.Include("Person")
    orderby family.PrimaryLastName, family.Tag
    select family;
  • Linq-to-Entity 查询返回一个 IOrderedQueryable 结果,它不会自动反射(reflect)底层数据的变化,例如,如果我通过代码向实体数据模型添加一条新记录,这条新记录的存在不会自动反射(reflect)在引用 Linq 查询的各种控件。因此,我将这些查询的结果放入 ObservableCollection 中,以捕获底层数据更改:
    familyOC = new ObservableCollection<Family>(families.ToList());
  • 然后我将 ObservableCollection 映射到 CollectionViewSource,这样我就可以进行过滤、排序等操作,而无需返回数据库。
    familyCVS.Source = familyOC;
    familyCVS.View.Filter = new Predicate<object>(ApplyFamilyFilter);
    familyCVS.View.SortDescriptions.Add(new System.ComponentModel.SortDescription("PrimaryLastName", System.ComponentModel.ListSortDirection.Ascending));
    familyCVS.View.SortDescriptions.Add(new System.ComponentModel.SortDescription("Tag", System.ComponentModel.ListSortDirection.Ascending));
  • 然后我将各种控件和其他内容绑定(bind)到 CollectionViewSource:
    <ListBox DockPanel.Dock="Bottom" Margin="5,5,5,5" 
    Name="familyList"
    ItemsSource="{Binding Source={StaticResource familyCVS}, Path=., Mode=TwoWay}"
    IsSynchronizedWithCurrentItem="True"
    ItemTemplate="{StaticResource familyTemplate}"
    SelectionChanged="familyList_SelectionChanged" />
  • 当我需要添加或删除记录/对象时,我从实体数据模型和 ObservableCollection 手动执行此操作:
    private void DeletePerson(Person person)
    {
    entities.DeleteObject(person);
    entities.SaveChanges();
    personOC.Remove(person);
    }
  • 我通常使用 StackPanel 和 DockPanel 控件来定位元素。有时我会使用网格,但似乎很难维护:如果您想在网格顶部添加新行,则必须触摸网格直接托管的每个控件以告诉它使用新行。呃。 (微软似乎从未真正理解 DRY 概念。)
  • 我几乎从不使用 VS WPF 设计器来添加、修改或定位控件。 VS 附带的 WPF 设计器对查看表单的外观有点帮助,但即便如此,也不是真的,特别是如果您使用的数据模板未绑定(bind)到可用的数据设计时间。如果我需要编辑我的 XAML,我会像人一样对待它并手动完成。
  • 我的大部分真实代码都是用 C# 编写的,而不是 XAML。正如我所提到的 elsewhere ,完全抛开我还没有习惯在其中“思考”这一事实,XAML 给我的印象是一种笨拙、丑陋的语言,这也恰好伴随着糟糕的设计器和智能感知支持,并且无法调试。呃。因此,每当我可以清楚地看到如何在 C# 代码隐藏中执行某些在 XAML 中无法轻松执行的操作时,我都会在 C# 中执行此操作,而无需道歉。已经有很多关于在 WPF 页面中几乎从不使用代码隐藏(例如,用于事件处理)的好做法的文章,但至少到目前为止,这对我来说毫无意义。当我可以使用像 C# 这样的漂亮、干净的语言,它有一个世界级的编辑器,近乎完美智能感知和无与伦比的类型安全?

  • 所以这就是我所在的位置。有什么建议?我错过了其中的任何重要部分吗?我真的应该考虑以不同的方式做些什么吗?

    最佳答案

    您需要实现存储库模式以将 WPF 关注点与 EF 分开

    然后你可以使用泛型来降低 EF 到 CollectionViewSource 处理的复杂性

    一个设计良好的存储库应该降低代码级别并允许任何 ORM 被替换(需要进行体面的测试)

    一些想法在这里

    http://blog.nicktown.info/2008/12/10/using-a-collectionviewsource-to-display-a-sorted-entitycollection.aspx

    关于wpf - 将 Entity Framework 与 WPF 数据绑定(bind)结合使用的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/628437/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com