EF4 + MVVM - 在 ViewModel 中公开实体?

2024-02-11

我尝试过模型-视图-视图模型的一些不同实现,并且经常遇到我不确定正确的继续方法的情况。我知道 MVVM 的目标之一是将视图与应用程序逻辑解耦,以便可以在没有视图的情况下测试逻辑。将逻辑放入不依赖于 View 的 ViewModel 中可以解决此问题。伟大的。如果模型可以通过可以模拟的方式与 ViewModel 解耦,那就更好了。

所以我的问题是,ViewModel 应该将模型与视图解耦吗?换句话说,通过 ViewModel 将 EntityFramework 实体暴露给 View 是否“可以”?例如,假设视图中有一个组合框,用户可以在其中选择地址的州。在AddressViewModel中,State应该作为真实的实体类型属性公开,还是应该作为StateViewModel公开?如果它应该是 StateviewModel 类型的属性,我不明白应该如何在 AddressViewModel.State setter 中管理底层模型(因为属性中设置的是 StateViewModel 而不是 State 实体)。

在我看来,这可以是任何一种方式,但似乎更一致的是从不将模型直接暴露给视图。想法?


您应该努力将模型与您的视图完全解耦,这应该是一个目标,您可能会实现它,也可能不会,但这仍然应该是您的目标。

具体来说,您的问题涉及常量列表(或多或少),这是一个简单的情况。如果我错了请纠正我,但你可能有一个States表与一个code and a name对于每个州,然后您有另一个表,其中包含前一个州的外键。

在这种情况下,最好加载并创建StateViewModel在应用程序初始化期间列出一次,然后处理外键值(状态code可以说)在整个应用程序中而不是StateViewModel对象本身。您应该使用的属性是SelectedValue and SelectedValuePath of the ComboBox, 例子:

<ComboBox ItemsSource="{x:Static StateViewModel.StaticList}"
          SelectedValue="{Binding StateForeignKey}"
          SelectedValuePath="code"
          DisplayMemberPath="name" />

这将填充ComboBox with StateViewModel对象(使用现在配置的上下文创建的),但会传递所选项目的code属性到绑定字段StateForeignKey,此外,ComboBox将显示name属性,以便人类可读。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EF4 + MVVM - 在 ViewModel 中公开实体? 的相关文章

  • VB.NET 中的静态方法实现

    我很困惑Static在 VB NET 中的实现 在 C 中 我们可以创建静态类和静态方法来为我们的应用程序编写实用方法 现在 VB NET 让我们创建Module代替静态类 如果我们在模块中创建一个方法 默认情况下它会变成静态的 但在我的应
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 取消任务

    我尝试运行一个关于取消任务的简单示例 如下所示 CancellationTokenSource tokenSource2 new CancellationTokenSource CancellationToken token2 tokenS
  • Silverlight MVVM 绑定更新按不期望的顺序触发

    Scenario 在 Silverlight 4 MVVM 项目中 我们有一个ListBox控件包含项目 所选项目以双向方式绑定到 ViewModel 中的相应属性 另一个控件 出于某种原因 我将其精简为一个TextBox 是绑定到所选项目
  • 自定义 IQueryable

    我正在尝试自定义应用程序的实体 使它们具有引用加载它们的 DataContext 的属性 我认为最好的方法是以某种方式创建一个实现 IQueryable 的类 并在其 GetEnumerator 方法中设置实体 datacontext 属性
  • 视图中的 XamlParseException

    我有一个仅显示标签的视图 视图模型已正确注入视图中 因为标签的文本已绑定到视图模型属性 现在 如果我尝试在 xaml 中定义 DataGrid 则会出现 XamlParseException System Windows Markup Xa
  • 如何在C#背后的代码中动态创建数据模板并绑定TreeView分层数据

    我有一个场景 其中树视图动态更改其数据模板和数据绑定定义 我在 XAML 中创建了一个树视图 如下所示
  • 时间跨度格式[重复]

    这个问题在这里已经有答案了 当您将时间跨度声明为以下形式时 如何优雅地格式化时间跨度以表示 1 小时 10 分钟 TimeSpan t new TimeSpan 0 70 0 我当然知道你可以为此做一些简单的数学计算 但我有点希望 NET
  • 防止重入并确保某些操作获取锁的正确方法是什么?

    我正在设计一个基类 当继承该基类时 它将针对多线程环境中的上下文提供业务功能 每个实例可能都有长时间运行的初始化操作 所以我想让这些对象可重用 为此 我需要能够 为这些对象之一分配上下文以允许其完成工作 防止对象在已有上下文的情况下被分配新
  • ListView ItemContainerStyle 模板

    我创建了用作 ListView 项目模板的样式 其中包含 CheckBox 和 TextBlock
  • 如何使 WPF 应用程序在 Web 浏览器上运行

    我们有一个用 WPF 编写的现有应用程序 我们正在寻找一种迁移它的方法 以便它可以在 Web 浏览器上运行 深入研究后 我们似乎需要找到一种将代码编译为 WebAssembly 的方法 但我不确定它对于现有的完全加载的 WPF 应用程序有多
  • 使一个对象只能被同一程序集中的另一个对象访问?

    每个业务对象都有一个包含 sql 调用的匹配对象 我想限制这些 sql 对象 使其只能由匹配的业务对象使用 如何才能实现这一目标 Update 格雷格提出了关于可测试性的观点 由于 SqlObjects 将包含非常特定于业务流程的 sql
  • 先学Silverlight还是先学WPF?

    看来 Silverlight WPF 是 NET 用户界面开发的长期未来 这很棒 因为我可以看到在客户端和 Web 开发端重用 XAML 技能的优势 但看看 WPF XAML Silverlight 它们似乎是非常庞大的技术 那么从哪里开始
  • 自定义代码访问安全属性

    我创建了以下属性 Serializable AttributeUsage AttributeTargets Class AttributeTargets Method AllowMultiple true Inherited true pu
  • EF4如何在多对多关系中公开联接表

    假设我有以下表格 Essence EssenceSet 和 Essence2EssenceSet 其中 Essence2EssenceSet 仅保存前 2 个表的 ID 以形成 M M 关系 在 EF 中 由于 Essence2Essenc
  • 从数据库和文件系统中删除文件

    我有一个表引用我们网络上共享位置中的文件 将文件路径存储在数据库中 我有一个按钮需要从数据库中删除记录并从文件系统中删除文件 foreach var report in reports string filePath report Repo
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • IEnumerable 与 IReadOnlyList

    选择有什么区别IEnumerable
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐