在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,我不知道是否可以添加额外的字段在数据库表上。
所以在我写的时候,只有第一个想法已被证明有效,但我想要一些更清洁的东西。 有什么建议吗?
由于 菲利普
答案 0 :(得分:1)
你可以缩短这种约束力,没有什么不洁净的。
原件:
{Binding RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type Window}},
Path=DataContext.ActiveWorkspace}
最小
{Binding DataContext.ActiveWorkspace,
RelativeSource={RelativeSource AncestorType=Window}}
这做了一些事情:
Path=
。Type
。由于属性AncestorType
已经是Type
类型,x:Type
是多余的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 我可以轻松地将我错过的属性添加到模型中,因此这个解决方案是我能想到的最干净的。