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 中公开实体? 的相关文章

  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • .Net应用程序设置路径

    默认情况下 Windows 应用程序设置保存在该目录中 USERPROFILE Local Settings Application Data
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML
  • 从固定文档中删除页面?

    如何从固定文档中删除页面 我添加这样的页面 Add page to pageContent PageContent pageContent new PageContent IAddChild pageContent AddChild fix
  • 有没有办法禁用 .NET 标签的“双击复制”功能?

    这真的很烦人 我使用标签作为列表项用户控件的一部分 用户可以单击它来选择列表项 然后双击它来重命名它 但是 如果剪贴板中有名称 双击标签会将其替换为标签文本 我还检查了应用程序中的其他标签 双击它们也会将其复制到剪贴板 我没有在这个程序中编
  • Windows 窗体中的标准 Windows 菜单栏

    我注意到添加了一个MenuStrip 来自工具箱 我的表单设计不会产生像许多本机 Windows 应用程序中那样的菜单栏 相反 我得到了一个像 Visual Studio 自己的菜单栏 没有任何样式设置MenuStrip似乎模仿了更常见的本
  • .NET EXE 内存占用

    即使是一个简单的Notepad http en wikipedia org wiki Notepad 28software 29C 中的应用程序消耗兆字节的 RAM 如任务管理器中所示 最小化应用程序时 任务管理器中的内存大小会显着下降 并
  • MS Source Server - 使用 srctool 查看时源流显然不存在

    我一直在尝试安装 MS 调试工具中的 MS Source Server 内容 目前 我正在通过 Subversion 索引命令运行我的代码 pdbs 该命令现在按预期运行 它为给定的 pdb 文件创建流并将其写入 pdb 文件 但是 当我在
  • 在c#中映射两个类

    我有两节课 public class foo1 public int id public string image link public string sale price and public class foo2 public int
  • 缓冲数据库游标中的数据,同时保持 UI 响应

    我有一个已填充的数据库目录和一个可用于检索对象的游标 这个目录显然可能非常大 我想做的是使用反应式用户界面缓冲数据 同时保持 UI 数据绑定和响应 我按照步骤操作here http www interact sw co uk iangblo
  • .net 中的 deflate、gzip 和 zlib 的一个库

    首先 我们来定义一些容易混淆的术语 deflate compression algorithm zlib header deflate trailer gzip header deflate trailer 我正在寻找一个基本上可以让我执行
  • 如何在清除排序描述后删除wpf网格排序箭头

    我单击网格标题对列进行排序 然后单击 重置 按钮以通过其集合视图清除排序描述 但排序箭头图标仍然保留在标题中 如何去除它 我在尝试弄清楚如何完全清除网格中的排序时遇到了这个问题 感谢 krishnaaditya 回答如何清除标题中的排序箭头
  • CLR 2.0 与 4.0 性能比较?

    如果在 CLR 4 0 下运行 为 CLR 2 0 编译的 NET 程序会运行得更快吗 应用程序配置
  • 从同一个类中的另一个构造函数调用构造函数

    我有一个带有两个构造函数的类 C 这是代码片段 public class FooBar public FooBar string s constructor 1 some functionality public FooBar int i
  • 在Linux中,找不到框架“.NETFramework,Version=v4.5”的参考程序集

    我已经设置了 Visual studio 来在我的 Ubuntu 机器上编译 C 代码 我将工作区 我的代码加载到 VS 我可以看到以下错误 The reference assemblies for framework NETFramewo
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • 等待 IAsyncResult 函数直至完成

    我需要创建等待 IAsyncResult 方法完成的机制 我怎样才能做到这一点 IAsyncResult result contactGroupServices BeginDeleteContact contactToRemove Uri
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • DataTable.GetChanges() 不断返回 NULL

    我正在尝试获取存在于的所有行allData但不在removeData public static DataTable RemoveDuplicateRows DataTable allData DataTable removeData re

随机推荐