【问题标题】:Related table declarative databinding in wpf/xamlwpf/xaml 中的相关表声明性数据绑定
【发布时间】:2011-10-15 15:07:08
【问题描述】:

我一直在研究一个非常小规模的 WPF 项目,以便在阅读 Nathan 的书时熟悉它。我正在尝试在具有来自同一数据集的多个表的单个窗口上进行声明性绑定。架构(名称已更改以保护无辜者)为:tblMany2--tblOne--tblMany1

XAML 在下面,但简而言之:

  • 我在 windows _loaded 处理程序中设置了数据上下文。我已经尝试过数据集和概念上作为主表的表 (tblMany1)。
  • 我将组合框上的 ItemSource 设置为 tblMany1。
  • 我将第二个组合框上的 ItemSource 设置为外键数据关系(最初它是一个 tbo,但我已经工作了一段时间)。
  • 这个想法是通过更改第一个组合框来控制第二个组合框(和其他控件)。
  • 目前的结果是第二个组合框中的空白条目,调试输出显示找不到我将 ItemsSource 设置为的任何对象的属性。

XAML:

<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace;system;assembly=mscorlib"
mc:Ignorable="d"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:my="clr-namespace:MyProject"
xmlns:dx="clr-namespace:System.Diagnostics;assembly=WindowsBase" 
    Height="500"
    Width="700"
    d:DesignHeight="350" d:DesignWidth="525" SizeToContent="WidthAndHeight">

<Window.Resources>
    <!--Data-->


    <!--Styles-->
    <Style x:Key="buttonStyle">
        <Setter Property="Button.Width" Value="85" />
        <Setter Property="Button.Height" Value="30" />
    </Style>
    <Style x:Key="chkImageStyle" TargetType="Image">
        <Setter Property="Image.Height" Value="25" />
        <Setter Property="Image.Width" Value="30" />
        <Setter Property="Image.Margin" Value="100,30,0,0" />
        <Setter Property="Image.Stretch" Value="Fill" />
        <Setter Property="Image.VerticalAlignment" Value="Top" />
        <Setter Property="Grid.Column" Value="1" />
        <Setter Property="Image.Source" Value="checkmark.jpg" />
        <Setter Property="Image.Visibility" Value="hidden" />
    </Style>

    <!--Data Tempaltes-->
    <DataTemplate x:Key="tblMany1Date">
        <TextBlock Text="{Binding Path=tblMany1Date, StringFormat=d,dx:PresentationTraceSources.TraceLevel=High}" />
    </DataTemplate>

    <DataTemplate x:Key="tblOneLink">
        <TextBlock HorizontalAlignment="Center">
            <Hyperlink NavigateUri="{Binding Path=tblOne.Link}">
                <Run Text="{Binding Path=tblOne.Name}" />
            </Hyperlink>
        </TextBlock>
    </DataTemplate>

</Window.Resources>

<Viewbox Stretch="Uniform" Height="500" Width="750">
    <!-- Main Dockpanel-->
    <DockPanel Name="DockPanel1">

        <!-- NavPane -->
        <StackPanel Height="315" Background ="LightBlue" DockPanel.Dock="Left" Name="StackPanel1" Width="135">
            <Button Margin="5" Content="New" Name="btnNewOne" Style="{StaticResource buttonStyle}"/>
            <Label Margin="0" Content="ManyDate:" Name="lblDate" />

            <!--Primary Control-->
            <ComboBox Margin ="0" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Path=tblMany1}"
                  ItemTemplate="{StaticResource tblMany1Date}" Height="23" Name="cboDate" Width="120"
          ForceCursor="False" AllowDrop="False" />

            <TextBlock Margin="-5" Visibility="Hidden"/>

            <Label Margin="0" Content="OneName:" Name="lblOneName" />

            <ComboBox Margin="0" ItemsSource="{Binding FK_tblMany1_tblOne}"
                ItemTemplate="{StaticResource tblOneLink}" Name="cboOne" />

        </StackPanel>
    </DockPanel>
</Viewbox>

【问题讨论】:

    标签: .net wpf xaml data-binding


    【解决方案1】:

    据我所知,您将两个组合框绑定到同一个数据上下文。 但如果我理解正确,您希望第二个组合框显示与第一个组合框的选定项目相关的项目。

    您可以通过这种方式实现这一点(更改数据上下文):

    <ComboBox DataContext="{Binding SelectedItem, ElementName=cboDate}" Margin="0" ItemsSource="{Binding FK_tblMany1_tblOne}"
                ItemTemplate="{StaticResource tblOneLink}" Name="cboOne" />
    

    或者这样:

    <ComboBox Margin="0" ItemsSource="{Binding tblMany1/FK_tblMany1_tblOne}"
                ItemTemplate="{StaticResource tblOneLink}" Name="cboOne" />
    

    代码tblMany1/FK_tblMany1_tblOne 中的斜线符号表示绑定获取tblMany1 集合的当前项,然后获取该项的属性FK_tblMany1_tblOne

    编辑 因为只有两个表,并且您希望显示相同的集合(但具有不同的字段),所以正确的代码可能如下所示:

    <ComboBox Margin="0" ItemsSource="{Binding tblMany1}"
                ItemTemplate="{StaticResource tblOneLink}" Name="cboOne" />
    

    【讨论】:

    • 谢谢——这对我正在合作的关系之一有所帮助。但是在这个特定的问题上,我仍然有问题。无论我做什么,它都无法识别这种关系中的外键。我觉得这与关系的“方向性”有关——我绑定的选定项是关系的许多方面,第二个组合框上的目标属性是 ONE 方面。这有意义吗?
    • @dansan 您能否在问题中添加表格图的屏幕截图?了解属性是集合还是单个对象很重要。在这种情况下,我需要知道 FK_tblMany1_tblOne 和 tblOne 属性的类型
    • 很遗憾,我无法发布图片,因为我的声誉太差了。但是,tblMany1 通过 tblOne_name varchar(50) 字段与 tblOne 相关联。外键是 tblMany1_tblOne_Name。该关系被命名为 FK_Many1_tblOne。不幸的是,在数据集设计器中,您看不到许多表中的关系属性,或者仅在一个表中。这就是为什么我怀疑这是问题所在,因为我试图通过数据绑定从多个导航到一个。
    • @dansan 您可以直接将图片上传到 imgur.com,然后只发布一个链接。我更新了我的答案,我认为主要问题是因为属性名称令人困惑。在我之前看到的示例中,有明确的名称,例如客户、订单和关系 CustomerOrders。
    • @dansan 还有一个重要提示:您只能通过子关系绑定——不能通过父关系绑定。也许这就是原因。最好创建一些 c# 类,从数据源中填充它们,并将组合框绑定到 c# 对象。
    【解决方案2】:

    我不知道的事情:父子设置在数据集设计器中的重要性。我假设通过反转它们,我也会反转关系。然而,事实并非如此。一直以来的问题是 tblMany1 和 tblOne 之间的导航/关系属性是默认定义的,与概念情况相反。

    感谢 vorrtex 提供有关“/”语法的重要信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-23
      • 1970-01-01
      • 2023-01-16
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多