在许多项目中,您可能需要创建多个组合框(也称为选择列表),其中下一个组合框取决于在第一个组合框中所做的选择。当在第一个框中选择了值时,下一个框应基于选择的第一个值来显示值。例如,您有两个组合框:一个显示汽车公司名称(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 中)。
<XmlDataProvider x:Key="comboDataSource" Source="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>
如您所见,新资源被命名为 comboDataSource,路径指向 data.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 指向由用户选择的值填充的特性。
第二个组合框与第一个组合框类似。唯一的区别是,数据源来自第一个组合框。用户从 XML 文件中将选择一个节点。因此,该节点现在将作为第一个组合框中的选定条目进行加载。该节点还了解选定条目的子条目。
<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。