【问题标题】:Data binding when model objects lacks some properties模型对象缺少某些属性时的数据绑定
【发布时间】: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


【解决方案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=

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2017-03-01
        • 2023-03-06
        • 1970-01-01
        • 2023-03-14
        • 2020-09-18
        • 1970-01-01
        • 2020-11-10
        • 1970-01-01
        • 2011-03-10
        相关资源
        最近更新 更多