模型对象缺少某些属性时的数据绑定

时间:2012-02-20 12:19:54

标签: wpf linq-to-sql mvvm extension-methods data-binding

在MVVM场景中,使用linq2sql从数据库表创建模型“Impegni”。 Wpf表单显示所有'Impegni'字段,这实现了将视图模型ImpegnoSelezionato(类型为'Impegni')暴露的对象绑定到包含所有其他UI控件的网格的DataContext。 不幸的是,在表单中需要显示更多字段,其中一部分可能直接从模型派生(例如,其中一个是两个模型字段之间的布尔比较)。 第一种解决方案是在viewmodel中公开其他属性。 由于在Grid上设置了DataContext,每个显示viewmodel上添加的属性的新控件都需要如下内容:

DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=  {x:Type Window}}, Path=DataContext.ActiveWorkspace}"

这对我来说是一个非常奇怪的语法,我无法相信没有更简单易用的东西。

我的第二个想法是为'Impegni'模型创建一些方法扩展。这些方法不需要任何参数,并且等同于属性的getter方法 在进行一些网上冲浪后,似乎将控件绑定到方法而不是属性的唯一方法是使用ObjectDataProvider而我无法找到在'ObjectType =“{x:Type ??}'中写入的内容/ p>

第三个想法是用一些更多的属性重新生成模型,但正如我之前所说的,它来自使用linq2sql的dfatabase表:我是一个newbe,我不知道是否可以添加额外的字段在数据库表上。

所以在我写的时候,只有第一个想法已被证明有效,但我想要一些更清洁的东西。 有什么建议吗?

由于 菲利普

3 个答案:

答案 0 :(得分:1)

你可以缩短这种约束力,没有什么不洁净的。

原件:

{Binding RelativeSource={RelativeSource Mode=FindAncestor,
                                        AncestorType={x:Type Window}},
         Path=DataContext.ActiveWorkspace}

最小

{Binding DataContext.ActiveWorkspace,
         RelativeSource={RelativeSource AncestorType=Window}}

这做了一些事情:

  1. 使用标记扩展构造函数。第一个未命名的参数作为构造函数参数传递到binding that is the path,因此可以删除Path=
  2. 使用隐式转换为Type。由于属性AncestorType已经是Type类型,x:Type是多余的
  3. 隐式设置属性,在这种情况下设置AncestorType也会将Mode设置为FindAncestor。 (你也可以在这里使用构造函数来放弃Mode=

答案 1 :(得分:0)

绑定到“派生”模型值的典型解决方案是将MultiBinding与多值转换器(IMultiValueConverter)结合使用。

答案 2 :(得分:0)

对于第三个想法,我找到了这个有用的帖子: How to correctly add a runtime-calculated, non-persistant read-only property to a LinqToSQL data class 我可以轻松地将我错过的属性添加到模型中,因此这个解决方案是我能想到的最干净的。