【问题标题】:Binding Controls to more than one DataTable将控件绑定到多个 DataTable
【发布时间】:2009-03-23 14:59:31
【问题描述】:

这可能是一个奇怪的问题,但我来了(请告诉我这是一个糟糕的数据库设计还是我所处的奇怪情况)。

我的数据库中有两个表:ProductGroup 和Parameters。一个包含根据其名称有关各种产品组的信息,另一个包含有关可应用于每个组的各种参数的信息(从而使每个组不同)。

现在要关联这两个表,设置第三个表 - GroupParameters 具有两个主键:parameterId 和 groupId,第三列是该组的参数值。

现在我有一个屏幕,可以显示有关每个组及其参数值的信息。用户也应该能够编辑这些值。因此,我的问题是如何将此值(存储在第三个表中)绑定到文本框。一般来说,在这种情况下我将如何绑定控件。

谢谢大家!

编辑:我遗漏了一个重要的细节。我想使用 DataSetDataTable 对象来存储数据库中的内存数据并将它们绑定到控件。其原因与问题无关,但它与我必须跟踪更改并能够按照用户的意愿撤消它们有关:(

【问题讨论】:

  • 我认为这篇文章中有一个轻微但可能令人困惑的错字。我认为海报的意思是:“我的数据库中有两个表:ProductGroup 和Parameters”。
  • 表名无关。您可以将其称为参数或组参数,该表包含可应用于组的参数的 ID、名称和描述(在 ProductGroup 表中描述)。
  • 您不能将其称为 GroupParameters,因为这是第三个表的名称(与前两个表相关);)对于试图回答问题的人来说,这只是一个小问题。
  • 谢谢大家!我在原来的帖子里改了。

标签: wpf data-binding wpf-controls


【解决方案1】:

我在这里没有看到任何真正糟糕的设计。

您可以为此构建 UI 作为用户必须从中选择的产品组列表(ListBox 绑定到 ProductGroups 集合),然后您可以拥有一个带有 ListBox、名为 CurrentGroupId 的属性和一些控制按钮的用户控件(例如“确定”)。将 CurrentGroupId 绑定到 ProductGroups 列表框的选定值。当 CurrentGroupId 更改或参数集合更改时,您应该使用 LINQ 或其他方式过滤此内部 ListBox 项目 - 基本上用 GroupParameter-s 重新填充 ListBox,其中 CurrentGroupId 与所选 ProductGroupId 匹配。 ListBox 项应该是 GroupParameter-s 对象。

现在(终于 :))回答您的问题:您可以使用数据模板列表的项目来拥有一个文本框,像这样绑定到 Value 属性(这里“本地”是您的命名空间):

<DataTemplate DataType={x:Type local:GroupParameter}>
  <StackPanel Orientation="Horizontal">
    <TextBox Text="{Binding Value, Mode=TwoWay}" />
    <Button Content="OK" Click=INSERT_YOUR_OK_HANDLER_HERE />
    <Button Content="Cancel" Click=INSERT_YOUR_CANCEL_HANDLER_HERE />
  </StackPanel>
</DataTemplate>

如果您需要让用户能够添加新参数,您可以创建一些添加功能,该功能将在参数集合中添加一个具有当前选定组 ID 的新条目。然后用户可以在您的用户控件中编辑刚刚添加的项目。

希望它有所帮助,如果我刚才所说的内容难以理解,我想我可以用代码编写大部分内容。不要犹豫,问我:)

【讨论】:

    【解决方案2】:

    实际上对我最有效的方法是使用MultiBinding。我没有意识到这一点 - 不得不通过 Google 搜索查询自己学习很糟糕(即使通过书本学习会很慢)。

    【讨论】:

      猜你喜欢
      • 2010-10-30
      • 2011-10-02
      • 2015-01-30
      • 1970-01-01
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      相关资源
      最近更新 更多