将 EF4 与 Caliburn.Micro 绑定:我应该将我的实体公开为 ViewModel 的属性吗?

2024-04-02

使用 Caliburn.Micro,我想知道将 EF4 实体公开为 ViewModel 的属性(讨论过的一种技术)的优缺点here http://kboek.blogspot.com/2011/01/activerecord-caliburn-micro-and-one.html and here http://www.lhotka.net/weblog/InitialThoughtsOnMVVM.aspx)。这使我可以避免为每个字段编写 getter 和 setter(请参阅下面的 OneCustomer)。缺点是我需要在 XAML 中编写所有绑定语句(下面的 LastName 不在 ViewModel 中,但确实需要 XAML 绑定)。如果我坚持使用每个字段的属性填充 ViewModel 的规定技术(如下面的 FirstName),我最终将不得不编写大量额外的代码,以便调用 NotifyOfProperyChange。该应用程序将相当大。我应该将每个实体公开为 ViewModel 的属性吗?

在我的视图模型中:

private MyEntities _context = new MyEntities();
private BindableCollection<Customer> _custBindableCollection; 
private Customer _oneCustomer;
private string _firstName;

public void Load() 
{
    _custBindableCollection = new BindableCollection<Customer>(_context.Customers.Where(row => row.CustomerType == "FOO"));
    AllCustomers = _custBindableCollection;
    _oneCustomer = _custBindableCollection.FirstOrDefault();
    FirstName = _oneCustomer.FirstName;
    OneCustomer = _oneCustomer;
}

public BindableCollection<Customer> AllCustomers
{ 
get { return _custBindableCollection;}
set {_custBindableCollection = value;
      NotifyOfPropertyChange(() => AllCustomers);}
}

public Customer OneCustomer
{
 get { return _oneCustomer;}
 set { _oneCustomer = value;
        NotifyOfPropertyChange(() => OneCustomer);}
} 

public string FirstName
{
    get { return _firstName; }
    set {
        _firstName = value;
        _oneCustomer.FirstName = value;
        NotifyOfPropertyChange(() => FirstName);
        NotifyOfPropertyChange(() => CanSaveChanges);
    }
}

public void SaveChanges()
{ _context.SaveChanges(); }

public bool CanSaveChanges { get { return IsValid; } }

在我看来:

<StackPanel>
<StackPanel Orientation="Horizontal">
    <Label Content="First Name:" />
    <TextBox x:Name="FirstName" />
</StackPanel>
<StackPanel Orientation="Horizontal" DataContext="{Binding Path=OneCustomer}">
    <Label Content="Last Name:" />
    <TextBox x:Name="LastName" Text="{Binding LastName}" />
</StackPanel>
<Button Content="Load Data" x:Name="Load" />
<Button Content="Save" x:Name="SaveChanges"  />
<DataGrid x:Name="AllCustomers" />

提前致谢。


使用 Caliburn.Micro 我想知道暴露的优点和缺点 EF4 实体作为 ViewModel 的属性(此处讨论的技术 和这里)。

我不确定优点/缺点,但我可以告诉你这两种方法都被使用。例如,以一个简单的登录屏幕为例,通常我将 UserName 放在 ViewModel 上的一个属性,但在表单更复杂的情况下,ViewModel 可以聚合其他 ViewModel(显示模型)来完成相同的事情。 CM 不会影响优缺点,更多的是关于 MVVM 的优缺点是什么。 CM 将帮助您绑定两者。

  • 如果 ViewModel 上有一个名为 CustomerName 的属性,只需命名 文本框 x:name="CustomerName"。
  • 如果 ViewModel 上有一个属于类实例的属性 名为 Customer,将文本框命名为 x:name="Customer_Name" 并再次命名为 CM 将处理绑定。

所以从上面的 xaml 来看:

 <TextBox x:Name="LastName" Text="{Binding LastName}" />

您不需要在 StackPanel 上设置 DataContext。反而:

<TextBox x:Name="OneCustomer_LastName"/>

可以更轻松地绑定到 DataForms 和 DataGrid 的一件事是遵循一种方法,为数据在屏幕上的表示方式创建显示模型。

这是我的观点,但我个人永远不会直接绑定到 EF/Linq 实体。相反,我将创建一个显示模型来表示该实体以及我希望它如何显示和使用自动映射器 http://automapper.org/进行映射。在很多情况下,它是一对一的映射。这可能看起来是浪费时间,但它具有优势,特别是对于更复杂的数据模型布局,显示模型允许您展平数据以用于显示目的,并属性属性以进行验证,而无需将它们粘贴在数据模型实体上。有关更多信息,请参阅其中的章节ASP.NET MVC 实际应用 http://www.manning.com/palermo2/ book.

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

将 EF4 与 Caliburn.Micro 绑定:我应该将我的实体公开为 ViewModel 的属性吗? 的相关文章

  • EF4 Code First:如何在不添加导航属性的情况下添加关系

    我应该如何使用 Code First 但不使用任何导航属性来定义关系 之前 我通过在关系的两端使用导航属性来定义一对多和多对多 并在数据库中创建适当的关系 这是类的精简版本 为了简单起见 我已将多对多关系转换为一对多关系 public cl
  • 具有不同 ID 字段名称的 EF Fluent API 多对多

    在这个问题中 Ef 多对多 https stackoverflow com questions 8927278 how to configure many to many relationship using entity framewor
  • 非静态方法需要一个目标

    private PMS USERS currUser private bool validateUserName dbContext new PmsEntities var validateUser dbContext PMS USERS
  • 静态构造函数中的 Database.SetInitializer() ?

    许多人可能知道为什么我们需要使用下面所示的代码 但是 我想将此逻辑分成几层 并且不想在 Web 层中引用实体框架 DLL 因此我最终将此代码放入我的静态构造函数中DbContext class 这是一个坏主意吗 这样做会对应用程序的性能造成
  • 列表元素之间的 Tab WPF

    我有一个列表框 其中每个项目都使用文本框表示 问题是我希望能够在移动到 xaml 窗口中的下一个元素之前在列表框中的所有项目之间进行切换 当前 和正常的 WPF 行为 是 当我按 Tab 键进入列表框时 第一个元素会突出显示 如果我再次按
  • 我可以将 UseCSharpNullComparisonBehavior 用于单个查询吗?

    我有一个查询 该查询曾经是存储过程 现已转换为 EF 查询 现在已经超时了 使用 SQL Profiler 我可以看到生成的 SQL 的唯一区别是 EF 转变的新行为entity Property value into entity Pro
  • 实体框架:ObjectSet 及其(泛型)方差

    我使用 EntityFramework POCO 事情是这样的 public interface IBaseType int Id get set public class BaseType IBaseType public virtual
  • 如何让 DataTemplate.DataTrigger 检查大于或小于?

    下列DataTemplate DataTrigger如果是 则使年龄显示为红色equal to 30 如果是的话 如何使年龄显示为红色比 更棒 30
  • 根据 AD 组成员身份限制对 WPF 视图的访问

    我们有一个 WPF 应用程序 我们希望根据用户的 AD 组成员身份限制对应用程序的访问 我们可以将其作为每个视图的属性 或者作为用户启动应用程序时的检查吗 任何代码示例将不胜感激 在 NET 3 5 及更高版本上执行此操作的最简单方法是使用
  • LINQ to Entities 不支持指定的类型成员“UserName”

    我尝试使用 url 中的 id 参数来显示特定用户的图像 但收到以下错误消息 LINQ to 不支持指定的类型成员 UserName 实体 仅初始值设定项 实体成员和实体导航 支持属性 这是我的操作方法 HttpGet public Act
  • 有没有办法将所有内容都包含在 dbcontext 中?

    当查询一个DbContext急切加载时 需要Include Navigation 为了填充导航属性 然而 在某些情况下 我想简单地Include all实体的导航属性 有没有办法做到这一点 或者有办法做到这一点 我假设你可以反思 但我宁愿避
  • LINQ to Entities 如何更新记录

    好的 我对 EF 和 LINQ 都是新手 我已经弄清楚如何插入和删除 但由于某种原因更新似乎逃脱了我的掌握 这是我的代码示例 EntityDB dataBase new EntityDB Customer c new Customer Na
  • 尝试在 Expression-Blend 4 中打开在 Visual Studio 2010 中创建的 WPF 项目时出现问题

    我在 VS 2010 中创建 WPF 项目 在完成功能性 GUI 的工作后 我想在 Blend 4 中编辑控件模板 但是当我在 Blend 中以 DesignMode 打开项目时 他告诉我 无效的 XAML 在结果窗口中他写道 Window
  • WPF DataGrid 显示点而不是逗号

    在网上查找并寻找答案后没有结果 我想向您寻求帮助 我有一个包含 2 列的 SQL 数据库表 浮点数据类型 例如 1 2 1 3 1 4 等 绑定到一个DataGrid XAML 代码
  • MouseDoubleClick 事件不会冒泡

    我的场景经过简化 我有一个包含员工行的 ListView 在每个员工行中 都有 增加 和 减少 按钮来调整他的工资 假设在我的程序中 双击 员工 行意味着 解雇此人 The problem是当我快速单击 增加 时 这会触发 ListView
  • 如何提高Canvas渲染性能?

    我必须画很多Shape http msdn microsoft com en us library system windows shapes shape aspx 约 1 20 万 作为 Canvas 2 的子级 我在 WPF 应用程序中
  • 从 DataGridColumn 中绑定到 DataContext 属性

    财产Foo在我的DataContext ViewModel Visibility Foo 但我不知道如何访问Foo里面一个Column 在这种情况下 我认为它可能正在寻找Foo在任何绑定到的对象中DataGrid ItemsSource
  • Visual Studio 不显示设计数据

    我目前正在尝试将设计数据集成到我的 UWP 应用程序中 对于这种方法 我遵循了微软的步骤 https learn microsoft com en us windows uwp data binding displaying data in
  • WPF:BinaryFormatter 可以序列化 FlowDocument 实例吗?

    我喜欢使用binaryformatter来序列化流文档 但这是例外 Serializable public class BinFlow public FlowDocument my get set BinFlow myBF new BinF
  • 用什么? MVC、MVP 或 MVVM 还是……?

    我将启动一个 Java 项目来开发桌面应用程序 使用什么作为表示层模式 MVC MVP MVVM 或 如果可能的话 举一些可行的小例子 Actually the ultimate post you re looking for is thi

随机推荐

  • SQL Group By - 从单列生成多个聚合列

    我想按公司和日期进行分组 并为 2 个单独的值 Flag Y 和 Flag N 生成计数列 输入表如下所示 Company Date Flag 001 201201 Y 001 201201 N 001 201202 N 001 20120
  • 使用 Paypal IPN 订阅

    我正在使用 Paypal IPN 添加订阅到网站 效果非常好 我可以成功创建新订阅并验证它 该订阅有两周的免费试用期 不幸的是 该指南对订阅状态的描述有点含糊 目前 一旦收到 subscr signup 或 subscr payment 用
  • 什么会导致 Java 在 System.exit() 之后继续运行?

    我有一个 Java 程序 正在通过以下方式启动ProcessBuilder来自另一个 Java 程序 System exit 0 是从子程序调用的 但对于我们的一些用户 在 Windows 上 java exe与子进程关联的进程不会终止 子
  • Visual Studio 2015 项目缺少所有引用

    从今天开始 一个属于有20个项目的解决方案的WPF项目 将我的所有引用设置为缺失 我刚刚检查了 MS 的建议和 Stackoverflow 上的其他答案 但没有一个起作用 我尝试从 SVN 重新获取解决方案 但没有运气 其他同事没有遇到这个
  • 如何修复:致命异常:main android.os.NetworkOnMainThreadException [重复]

    这个问题在这里已经有答案了 我在 android 版本 18 上运行我的代码时遇到问题 我已经使用了 AsyncTask 但仍然收到错误 请帮助 我是编程新手 所以请原谅我的错误 package com example androidhiv
  • 提取 git 提交中更改的所有文件

    我需要为某人制作一个补丁 他们没有使用 git 由提交更改的文件的 zip 我想像 git archive format zip commitguid gt myfiles zip 但这会提取整个内容 而不仅仅是更改的文件 有什么办法可以做
  • 如何使用 Cocoa UI 制作 Java 应用程序?

    我必须在项目中使用 Java API 但由于我不喜欢 Java UI 并且我有一台 Mac 所以我想围绕 Java 代码构建一个本机 Cocoa 应用程序 我知道 Xcode 曾经为此类事情提供直接支持 但由于它不再提供 那么最好的方法是什
  • 在android webview中全屏播放HTML5视频

    好吧 我已经搜索了几天了 如何在 android WebView 上以全屏模式显示 HTML5 视频 我设法在我的网络视图上播放 HTML5 视频 以全屏模式显示视频时会出现问题 正如我所发现的 android 有两种处理 标签的方法 在
  • 将 Canvas 内容导出为 PDF

    我正在使用 HTML5 Canvas 做一些事情 一切都工作得很好 除了现在 我可以使用 Canvas2image 将画布内容导出为 PNG 但我想将其导出为 PDF 我做了一些研究 我很确定这是可能的 但我似乎无法理解我需要在代码中更改什
  • 网络共享的锁定行为有所不同

    我一直在尝试锁定文件 以便其他克隆服务无法访问该文件 然后我读取该文件 完成后移动该文件 通过使用允许移动FileShare Delete 然而 在后来的测试中 我们发现如果我们正在查看网络共享 则这种方法不起作用 我知道我的方法可能不是最
  • iPhone/iOS自定义控件

    我想知道如何从头开始创建自定义 iPhone 控件 或者使用现有的库或框架 我已经看到了 Three20 库 以及 Tapku 和 Touch Customs 它们对于专门的 iOS 控件 例如表格视图等 非常有用 但我在这里讨论的是制作完
  • Laravel - 如何设置 morphOne 关系

    我正在尝试为类别实现一个可变形表 现在我有以下内容 Snippet Table id title body Post Table id title body Category Table id name 我希望能够将帖子和片段改为只有一个类
  • 2038 年问题 - 64 位(Linux 操作系统、php、mysql)[重复]

    这个问题在这里已经有答案了 select unix timestamp 2038 01 19 回报2147472000 while select unix timestamp 2038 01 20 回报0 我查了一下年份2038问题 我的l
  • hibernate ManyToMany 与可连接的顺序

    我有以下数据库设置 T PARTICIPANT MOVEMENT ParticipantMove SID BigInt PK Participant SID BigInt FK MoveType SID BigInt FK MoveReas
  • cygdb ImportError:没有名为“Cython”的模块

    我想调试我的 Cython 代码并按照描述的确切步骤进行操作here http docs cython org src userguide debugging html 我的 Cython 代码编译 cython gdb xxx pyx进而
  • R strptime/as.POSIXct 中的未知时区名称

    在哪里可以找到 R 函数的所有合法时间名称的列表as POSIXct as POSIXct 1970 01 01 tz CST 生成一条警告 指出 CST 中部标准时间 未知 时区的东西可以驱动你NUTS 由于位于德国 我过去常常这样做来设
  • ASP.NET MVC:ValueProvider 的执行顺序

    我想知道不同的执行顺序ValueProviders在 ASP NET MVC 中 价值提供者 查询字符串值提供者 路由数据值提供者 表单值提供者 我没有找到信息 如果我没记错的话 优先顺序是这样的 请求中的表单数据 路线数据 请求参数 Ht
  • Matplotlib:图例未正确显示

    我有不同类别的数据点 我想将其可视化 这是我得到的图像 https i stack imgur com qwCLC jpg https i stack imgur com qwCLC jpg 有 10 个类别的 3000 个数据点 每个类别
  • opencv矩阵数据能保证连续吗?

    我知道 OpenCV 矩阵中包含的数据不能保证是连续的 为了让自己清楚 这里有一段Opencv 文档 https docs opencv org 3 4 0 d3 d63 classcv 1 1Mat html details OpenCV
  • 将 EF4 与 Caliburn.Micro 绑定:我应该将我的实体公开为 ViewModel 的属性吗?

    使用 Caliburn Micro 我想知道将 EF4 实体公开为 ViewModel 的属性 讨论过的一种技术 的优缺点here http kboek blogspot com 2011 01 activerecord caliburn