【发布时间】:2012-02-20 12:19:54
【问题描述】:
在 MVVM 场景中,模型“Impegni”是使用 linq2sql 从数据库表创建的。 Wpf 表单显示所有“Impegni”字段,这是通过将视图模型公开的对象(类型为“Impegni”的 ImpegnoSelezionato)绑定到包含所有其他 UI 控件的网格的 DataContext 来实现的。 不幸的是,在表单中需要显示更多字段,其中一部分可能直接来自模型(例如,其中一个是两个模型字段之间的布尔比较)。 第一个解决方案是在视图模型中公开其他属性。 由于在 Grid 上设置了 DataContext,每个显示视图模型上添加的属性的新控件都需要类似:
DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType= {x:Type Window}}, Path=DataContext.ActiveWorkspace}"
这对我来说是一种非常奇怪的语法,我无法相信没有更简单的东西可以使用。
我的第二个想法是为“Impegni”模型创建一些方法扩展。这些方法不需要任何参数,相当于属性的 getter 方法。
经过一些网上冲浪后,似乎将控件绑定到方法而不是属性的唯一方法是使用 ObjectDataProvider,但我无法找到在 'ObjectType="{x:Type ??}'
第三个想法是使用更多属性重新生成模型,但正如我之前所说,它来自使用 linq2sql 的 dfatabase 表:我是新手,我不知道是否可以添加额外的字段在数据库表上。
所以在我写的时候,只有第一个想法被证明是有效的,但我想要一些更清洁的东西。 有什么建议吗?
谢谢 菲利波
【问题讨论】:
-
第一个选项的语法很好
-
我必须搜索几个小时才能找到覆盖 DataContext 的奇怪方法。我原以为我可以以更简单的方式实现该目标(将特定组件的 DataContext 恢复为其默认值)。
-
您只是在父窗口的 ViewModel 中寻找“ActiveworkSpace”。没什么不好的。
标签: wpf linq-to-sql mvvm extension-methods data-binding