级联组合框(选择列表)

在许多项目中,您可能需要创建多个组合框(也称为选择列表),其中下一个组合框取决于在第一个组合框中所做的选择。当在第一个框中选择了值时,下一个框应基于选择的第一个值来显示值。例如,您有两个组合框:一个显示汽车公司名称(BMW、Mercedes、Ferrari 等),第二个显示选定公司的汽车类型(对于 BMW:1、2、5、X2、X5……;对于 Mercedes:A、B、C、CL、CLS……)。

第一步:创建数据源

为了填充这两个组合框,您需要从其获取数据的源。由于 WPF 附带了原生 XML 引擎,因此您可以创建包含数据的 XML 文件。该 XML 文件包含用于第一次选择的第一级内容。每个条目都具有用于第二次选择的子条目。如果您需要第三级或更多嵌套的选择列表,这些第二级条目甚至可以具有更多子条目。这看起来如下所示:

创建 data.xml 文件,将此内容复制到该文件,然后将该文件保存在要将级联组合框添加到其中的 .xaml 文件附近(例如 C:\ProgramData\Autodesk\Vault <发行年份>\Extensions\DataStandard\Vault\Configuration 中)。

第二步

下一步就是将 data.xml 作为资源添加到 Data Standard.xaml 文件中。这样做是为了组合框可以使用这些数据。
  1. 将下面的行添加到 XAML 文件的资源部分中:
    <XmlDataProvider x:Key="comboDataSource"
    Source="C:\ProgramData\Autodesk\Vault 2015\Extensions\DataStandard\Vault\Configuration\data.xml"/>
    
    注: Vault 2015 R2 用户应使用此路径:C:\ProgramData\Autodesk\Vault 2015\Extensions\DataStandard\Vault\Configuration\data.xml
    整个资源部分看起来如下所示:
    <prop:dsWindow.Resources xmlns:prop="clr-namespace:dataStandard.UI.View;assembly=dataStandard.UI">
    ...
    ......
    ....
    <XmlDataProvider x:Key="comboDataSource" Source="C:\ProgramData\Autodesk\Vault 2015\Extensions\DataStandard\Vault\Configuration\data.xml"/>
    </prop:dsWindow.Resources>
    注: Vault 2015 R2 用户应使用此路径:C:\ProgramData\Autodesk\Vault 2015\Extensions\DataStandard\Vault\Configuration\data.xml

    如您所见,新资源被命名为 comboDataSource,路径指向 data.xml。

第三步

现在,创建组合框,并让它们指向 XML 中的第一级数据和相应的第二个级数据。以下是第一个组合框的示例:
<ComboBox x:Name="ComboCarCompanies" Grid.Column="1" Grid.Row="5" 
  ItemsSource="{Binding Source={StaticResource comboDataSource}, XPath=/Data/Companies/*}"
  Text="{Binding Prop[CarVendor].Value}" DisplayMemberPath="@Name"
  SelectedValue="{Binding Prop[CarVendor].Value}" SelectedValuePath="@Name" />

在本示例中,组合框被命名为 ComboCarCompanies,放置在第 1 列、第 5 行中。该组合框的内容源来自名为 comboDataSource 的资源。XPath 指向正确的路径以便读取内容。所有内容都在元素 Companies 之下。元素 Companies 的子条目都具有一个称为 Name 的成员。因此,属性 DisplayMemberPath 和 SelectedValuePath 指向 @Name。属性 Text 和 SelectedValue 指向由用户选择的值填充的特性。

  1. 进行更改后,保存文件,然后查看对话框。第一个组合框应能正确显示值。

    第二个组合框与第一个组合框类似。唯一的区别是,数据源来自第一个组合框。用户从 XML 文件中将选择一个节点。因此,该节点现在将作为第一个组合框中的选定条目进行加载。该节点还了解选定条目的子条目。

  2. 使用第二个组合框指向第一个组合框的选定条目,就是为了获取子值以进行显示。代码如下所示:
    <ComboBox x:Name="ComboCarType" Grid.Column="1" Grid.Row="6"
    ItemsSource="{Binding SelectedItem, ElementName=ComboCarCompanies}"
    Text="{Binding Prop[CarType].Value}" DisplayMemberPath="@Type"
    SelectedValue="{Binding Prop[CarType].Value}"
    SelectedValuePath="@Type"/>
    

    我们示例中的大部分属性与第一个组合框中的属性起着相同的作用。实际的区别在于 ItemSource。在本示例中,名为 ComboCarCompanies 的第一个组合框指向 SelectedItem。

  3. 保存更改并查看对话框。