Пример: создание каскадных полей со списками для диалогового окна Data Standard

Создание нескольких полей со списками (также называемых списками выбора) для диалоговых окон Data Standard, где следующее поле со списком зависит от выбора, сделанного в первом поле.

При выборе значения в одном поле в следующем поле должны отображаться значения с учетом варианта, выбранного в предыдущем поле. Предположим, имеется два поля со списками: в одном отображаются наименования производителей автомобилей (BMW, Mercedes, Ferrari и т. д.), а во втором — модели автомобилей для выбранного производителя (для BMW — 1, 2, 5, X2, X5, для Mercedes — A, B, C, CL, CLS и т. д.).

Создать поле со списком

Существует четыре этапа создания поля со списком.

  1. Шаг 1. Создание источника данных

    Необходим источник, из которого будут поступать данные для заполнения поля со списком. Поскольку в WPF используется внутренний механизм XML, можно создать файл XML, который будет содержать данные. В файле XML для первых вариантов выбора используется содержимое первого уровня. Каждая запись имеет дочерние записи, содержащие вторые варианты выбора. Эти записи второго уровня также могут иметь дочерние элементы в случае, если требуется создать списки для выбора трех или более уровней.

    Это выглядит следующим образом:

    Создайте файл data.xml, скопируйте в него данное содержимое и сохраните файл в нужной папке (в данном случае — в папке C:\Temp).

  2. Добавление файла data.xml в качестве ресурса в Data Standard файл XAML. Благодаря этому в полях со списками появится возможность использовать данные.

    Добавьте следующие строки в раздел ресурсов в файле XAML:

    <XmlDataProvider x:Key="comboDataSource" Source="C:\Temp\data.xml"/>
    

    Таким образом, весь раздел ресурсов будет выглядеть следующим образом:

    <WPF:DSWindow.Resources xmlns:prop="clr-namespace:dataStandard.UI.View;assembly=dataStandard.UI">
        ...
        <XmlDataProvider x:Key="comboDataSource" Source="C:\Temp\data.xml"/>
    </WPF:DSWindow.Resources>
    

    Новому ресурсу присваивается имя comboDataSource, а путь указывает на файл data.xml.

  3. Теперь следует создать поля со списками и настроить их так, чтобы они указывали на данные первого уровня в файле XML и на соответствующий второй уровень.

    Далее представлен пример первого поля со списком:

    <ComboBox x:Name="ComboCarCompanies" Grid.Column="1" Grid.Row="6"
        ItemsSource="{Binding Source={StaticResource comboDataSource}, XPath=Data/Companies/Car}" Text="{Binding Prop[CarType].Value}"
        DisplayMemberPath="@Type" SelectedValue="{Binding Prop[CarType].Value}" SelectedValuePath="@Type"/>
    

    В качестве значения Source первого поля со списком устанавливается StaticResource-comboDataSource, которое было определено ранее.

    Второе поле со списком выглядит следующим образом:

    <ComboBox x:Name="ComboCarType" Grid.Column="1" Grid.Row="7"
        ItemsSource="{Binding SelectedItem, ElementName=ComboCarCompanies}" Text="{Binding Prop[CarType].Value}"
        DisplayMemberPath="@Type" SelectedValue="{Binding Prop[CarType].Value}" SelectedValuePath="@Type"/>
    

    Большинство атрибутов в данном примере выполняют ту же функцию, что и первое поле со списком. Реальное отличие заключается в ItemSource. В этом примере ItemSource поступает из SelectedItem первого поля со списком с именем ComboCarCompanies.

  4. Определите определения свойств CarType и Car: в Inventor.cfg или AutoCAD.cfg в зависимости от того, какой инструмент используется в этом примере, добавьте определения свойств для CarType и Car. См. сведения о добавлении определений свойств в файл конфигурации.

    Примечание. Начиная с версии VDS 2019 можно пропустить этот этап, так как VDS самостоятельно создает определение свойства для несуществующих параметров.
  5. Сохраните изменения и просмотрите диалоговое окно.