<div class="dx-fieldset">
  <div class="dx-field">
    <div class="dx-field-label">DropDownBox with embedded TreeView</div>
    <div class="dx-field-value">
      <dx-drop-down-box
        [(value)]="treeBoxValue"
        [inputAttr]="{ 'aria-label': 'Owner' }"
        [(opened)]="isTreeBoxOpened"
        valueExpr="ID"
        displayExpr="name"
        placeholder="Select a value..."
        [showClearButton]="true"
        [dataSource]="treeDataSource"
        (onValueChanged)="syncTreeViewSelection()"
        (onOptionChanged)="onTreeBoxOptionChanged($event)"
      >
        <div *dxTemplate="let data of 'content'">
          <dx-tree-view
            [dataSource]="treeDataSource"
            dataStructure="plain"
            keyExpr="ID"
            parentIdExpr="categoryId"
            selectionMode="single"
            displayExpr="name"
            [selectByClick]="true"
            (onContentReady)="$event.component.selectItem(treeBoxValue)"
            (onItemSelectionChanged)="treeView_itemSelectionChanged($event)"
          >
          </dx-tree-view>
        </div>
      </dx-drop-down-box>
    </div>
  </div>
  <div class="dx-field">
    <div class="dx-field-label">DropDownBox with embedded DataGrid</div>
    <div class="dx-field-value">
      <dx-drop-down-box
        [(value)]="gridBoxValue"
        [(opened)]="isGridBoxOpened"
        valueExpr="ID"
        [deferRendering]="false"
        [displayExpr]="gridBox_displayExpr"
        placeholder="Select a value..."
        [inputAttr]="{ 'aria-label': 'Owner' }"
        [showClearButton]="true"
        [dataSource]="gridDataSource"
        (onOptionChanged)="onGridBoxOptionChanged($event)"
      >
        <div *dxTemplate="let data of 'content'">
          <dx-data-grid
            [dataSource]="gridDataSource"
            [columns]="gridColumns"
            [hoverStateEnabled]="true"
            showBorders="true"
            [(selectedRowKeys)]="gridBoxValue"
            height="100%"
          >
            <dxo-selection mode="single"></dxo-selection>
            <dxo-filter-row [visible]="true"></dxo-filter-row>
            <dxo-scrolling mode="virtual"></dxo-scrolling>
            <dxo-paging [enabled]="true" [pageSize]="10"></dxo-paging>
          </dx-data-grid>
        </div>
      </dx-drop-down-box>
    </div>
  </div>
</div>
    
    import {
  enableProdMode, ChangeDetectionStrategy, ChangeDetectorRef, Component, NgModule, ViewChild,
} from '@angular/core';
import { HttpClient, HttpClientModule } from '@angular/common/http';
import { BrowserModule } from '@angular/platform-browser';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { lastValueFrom } from 'rxjs';
import { CustomStore } from 'devextreme-angular/common/data';
import { DxDataGridModule } from 'devextreme-angular';
import { DxTreeViewModule, DxTreeViewComponent, DxTreeViewTypes } from 'devextreme-angular/ui/tree-view';
import { DxDropDownBoxModule, DxDropDownBoxTypes } from 'devextreme-angular/ui/drop-down-box';
if (!/localhost/.test(document.location.host)) {
  enableProdMode();
}
let modulePrefix = '';
// @ts-ignore
if (window && window.config?.packageConfigPaths) {
  modulePrefix = '/app';
}
@Component({
  selector: 'demo-app',
  templateUrl: `app/app.component.html`,
  styleUrls: [`app/app.component.css`],
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class AppComponent {
  @ViewChild(DxTreeViewComponent, { static: false }) treeView: DxTreeViewComponent;
  treeDataSource: CustomStore;
  gridDataSource: CustomStore;
  isTreeBoxOpened = false;
  isGridBoxOpened = false;
  gridBoxValue = [3];
  treeBoxValue: string | string[] = '1_1';
  gridColumns = ['CompanyName', 'City', 'Phone'];
  constructor(private httpClient: HttpClient, private ref: ChangeDetectorRef) {
    this.treeDataSource = this.makeAsyncDataSource(this.httpClient, 'treeProducts.json');
    this.gridDataSource = this.makeAsyncDataSource(this.httpClient, 'customers.json');
  }
  makeAsyncDataSource(http: HttpClient, jsonFile: string) {
    return new CustomStore({
      loadMode: 'raw',
      key: 'ID',
      load() {
        return lastValueFrom(http.get(`../../../../data/${jsonFile}`));
      },
    });
  }
  syncTreeViewSelection() {
    if (!this.treeView) return;
    if (this.treeBoxValue) {
      this.treeView.instance.selectItem(this.treeBoxValue);
    } else {
      this.treeView.instance.unselectAll();
    }
  }
  treeView_itemSelectionChanged(e: DxTreeViewTypes.ItemSelectionChangedEvent) {
    this.treeBoxValue = e.component.getSelectedNodeKeys();
  }
  gridBox_displayExpr = ({ CompanyName, Phone }) => CompanyName && `${CompanyName} <${Phone}>`;
  onTreeBoxOptionChanged(e: DxDropDownBoxTypes.OptionChangedEvent) {
    if (e.name === 'value') {
      this.isTreeBoxOpened = false;
      this.ref.detectChanges();
    }
  }
  onGridBoxOptionChanged(e: DxDropDownBoxTypes.OptionChangedEvent) {
    if (e.name === 'value') {
      this.isGridBoxOpened = false;
      this.ref.detectChanges();
    }
  }
}
@NgModule({
  imports: [
    BrowserModule,
    DxTreeViewModule,
    DxDropDownBoxModule,
    HttpClientModule,
    DxDataGridModule,
  ],
  declarations: [AppComponent],
  bootstrap: [AppComponent],
})
export class AppModule { }
platformBrowserDynamic().bootstrapModule(AppModule);
    
    :host .dx-fieldset {
  height: 500px;
}
    
    // In real applications, you should not transpile code in the browser.
// You can see how to create your own application with Angular and DevExtreme here:
// https://js.devexpress.com/Documentation/Guide/Angular_Components/Getting_Started/Create_a_DevExtreme_Application/
const componentNames = [
  'accordion',
  'action-sheet',
  'autocomplete',
  'bar-gauge',
  'box',
  'bullet',
  'button-group',
  'button',
  'calendar',
  'card-view',
  'chart',
  'chat',
  'check-box',
  'circular-gauge',
  'color-box',
  'context-menu',
  'data-grid',
  'date-box',
  'date-range-box',
  'defer-rendering',
  'diagram',
  'draggable',
  'drawer',
  'drop-down-box',
  'drop-down-button',
  'file-manager',
  'file-uploader',
  'filter-builder',
  'form',
  'funnel',
  'gallery',
  'gantt',
  'html-editor',
  'linear-gauge',
  'list',
  'load-indicator',
  'load-panel',
  'lookup',
  'map',
  'menu',
  'multi-view',
  'nested',
  'number-box',
  'pagination',
  'pie-chart',
  'pivot-grid-field-chooser',
  'pivot-grid',
  'polar-chart',
  'popover',
  'popup',
  'progress-bar',
  'radio-group',
  'range-selector',
  'range-slider',
  'recurrence-editor',
  'resizable',
  'responsive-box',
  'sankey',
  'scheduler',
  'scroll-view',
  'select-box',
  'slider',
  'sortable',
  'sparkline',
  'speed-dial-action',
  'splitter',
  'stepper',
  'switch',
  'tab-panel',
  'tabs',
  'tag-box',
  'text-area',
  'text-box',
  'tile-view',
  'toast',
  'toolbar',
  'tooltip',
  'tree-list',
  'tree-map',
  'tree-view',
  'validation-group',
  'validation-summary',
  'validator',
  'vector-map',
];
window.exports = window.exports || {};
window.config = {
  transpiler: 'ts',
  typescriptOptions: {
    module: 'system',
    emitDecoratorMetadata: true,
    experimentalDecorators: true,
  },
  meta: {
    'typescript': {
      'exports': 'ts',
    },
    'devextreme/time_zone_utils.js': {
      'esModule': true,
    },
    'devextreme/localization.js': {
      'esModule': true,
    },
    'devextreme/viz/palette.js': {
      'esModule': true,
    },
    '@angular/platform-browser-dynamic': {
      'esModule': true,
    },
    '@angular/platform-browser': {
      'esModule': true,
    },
    '@angular/core': {
      'esModule': true,
    },
    '@angular/common': {
      'esModule': true,
    },
    '@angular/common/http': {
      'esModule': true,
    },
    '@angular/animations': {
      'esModule': true,
    },
    '@angular/forms': {
      'esModule': true,
    },
    'openai': {
      'esModule': true,
    },
  },
  paths: {
    'npm:': 'https://cdn.jsdelivr.net/npm/',
    'bundles:': '../../../../bundles/',
    'externals:': '../../../../bundles/externals/',
  },
  map: {
    'ts': 'npm:plugin-typescript@8.0.0/lib/plugin.js',
    'typescript': 'npm:typescript@4.2.4/lib/typescript.js',
    'jszip': 'npm:jszip@3.10.1/dist/jszip.min.js',
    /* @angular */
    '@angular/compiler': 'bundles:@angular/compiler.umd.js',
    '@angular/platform-browser-dynamic': 'bundles:@angular/platform-browser-dynamic.umd.js',
    '@angular/core': 'bundles:@angular/core.umd.js',
    '@angular/core/primitives/signals': 'bundles:@angular/core.primitives.signals.umd.js',
    '@angular/common': 'bundles:@angular/common.umd.js',
    '@angular/common/http': 'bundles:@angular/common-http.umd.js',
    '@angular/platform-browser': 'bundles:@angular/platform-browser.umd.js',
    '@angular/platform-browser/animations': 'bundles:@angular/platform-browser.umd.js',
    '@angular/forms': 'bundles:@angular/forms.umd.js',
    /* devextreme */
    'devextreme': 'npm:devextreme@link:../../packages/devextreme/artifacts/npm/devextreme/cjs',
    'devextreme-quill': 'npm:devextreme-quill@1.7.6/dist/dx-quill.min.js',
    'devexpress-diagram': 'npm:devexpress-diagram@2.2.24',
    'devexpress-gantt': 'npm:devexpress-gantt@4.1.64',
    /* devextreme-angular umd maps */
    'devextreme-angular': 'bundles:devextreme-angular/devextreme-angular.umd.js',
    'devextreme-angular/common/ai-integration': 'bundles:devextreme-angular/devextreme-angular-common-ai-integration.umd.js',
    'devextreme-angular/core': 'bundles:devextreme-angular/devextreme-angular-core.umd.js',
    'devextreme-angular/common/charts': 'bundles:devextreme-angular/devextreme-angular-common-charts.umd.js',
    'devextreme-angular/common/core/animation': 'bundles:devextreme-angular/devextreme-angular-common-core-animation.umd.js',
    'devextreme-angular/common/core/environment': 'bundles:devextreme-angular/devextreme-angular-common-core-environment.umd.js',
    'devextreme-angular/common/core/events': 'bundles:devextreme-angular/devextreme-angular-common-core-events.umd.js',
    'devextreme-angular/common/core/localization': 'bundles:devextreme-angular/devextreme-angular-common-core-localization.umd.js',
    'devextreme-angular/common/core': 'bundles:devextreme-angular/devextreme-angular-common-core.umd.js',
    'devextreme-angular/common/data/custom-store': 'bundles:devextreme-angular/devextreme-angular-common-data-custom-store.umd.js',
    'devextreme-angular/common/data': 'bundles:devextreme-angular/devextreme-angular-common-data.umd.js',
    'devextreme-angular/common/export/excel': 'bundles:devextreme-angular/devextreme-angular-common-export-excel.umd.js',
    'devextreme-angular/common/export/pdf': 'bundles:devextreme-angular/devextreme-angular-common-export-pdf.umd.js',
    'devextreme-angular/common/export': 'bundles:devextreme-angular/devextreme-angular-common-export.umd.js',
    'devextreme-angular/common/grids': 'bundles:devextreme-angular/devextreme-angular-common-grids.umd.js',
    'devextreme-angular/common': 'bundles:devextreme-angular/devextreme-angular-common.umd.js',
    'devextreme-angular/http': 'bundles:devextreme-angular/devextreme-angular-http.umd.js',
    'devextreme-angular/core/tokens': 'bundles:devextreme-angular/devextreme-angular-core-tokens.umd.js',
    ...componentNames.reduce((acc, name) => {
      acc[`devextreme-angular/ui/${name}`] = `bundles:devextreme-angular/devextreme-angular-ui-${name}.umd.js`;
      acc[`devextreme-angular/ui/${name}/nested`] = `bundles:devextreme-angular/devextreme-angular-ui-${name}-nested.umd.js`;
      return acc;
    }, {}),
    'tslib': 'npm:tslib/tslib.js',
    'rxjs': 'npm:rxjs@7.5.3/dist/bundles/rxjs.umd.js',
    'rxjs/operators': 'npm:rxjs@7.5.3/dist/cjs/operators/index.js',
    'rrule': 'npm:rrule@2.6.4/dist/es5/rrule.js',
    'luxon': 'npm:luxon@3.4.4/build/global/luxon.min.js',
    'es6-object-assign': 'npm:es6-object-assign',
    'inferno': 'npm:inferno@8.2.3/dist/inferno.min.js',
    'inferno-compat': 'npm:inferno-compat/dist/inferno-compat.min.js',
    'inferno-create-element': 'npm:inferno-create-element@8.2.3/dist/inferno-create-element.min.js',
    'inferno-dom': 'npm:inferno-dom/dist/inferno-dom.min.js',
    'inferno-hydrate': 'npm:inferno-hydrate/dist/inferno-hydrate.min.js',
    'inferno-clone-vnode': 'npm:inferno-clone-vnode/dist/inferno-clone-vnode.min.js',
    'inferno-create-class': 'npm:inferno-create-class/dist/inferno-create-class.min.js',
    'inferno-extras': 'npm:inferno-extras/dist/inferno-extras.min.js',
    '@preact/signals-core': 'npm:@preact/signals-core@1.8.0/dist/signals-core.min.js',
    // Prettier
    'prettier/standalone': 'npm:prettier@2.8.8/standalone.js',
    'prettier/parser-html': 'npm:prettier@2.8.8/parser-html.js',
  },
  packages: {
    'app': {
      main: './app.component.ts',
      defaultExtension: 'ts',
    },
    'devextreme': {
      defaultExtension: 'js',
    },
    'devextreme/events/utils': {
      main: 'index',
    },
    'devextreme/common/core/events/utils': {
      main: 'index',
    },
    'devextreme/events': {
      main: 'index',
    },
    'es6-object-assign': {
      main: './index.js',
      defaultExtension: 'js',
    },
    'rxjs': {
      defaultExtension: 'js',
    },
    'rxjs/operators': {
      defaultExtension: 'js',
    },
  },
  packageConfigPaths: [
    'npm:@devextreme/*/package.json',
    'npm:rxjs@7.5.3/package.json',
    'npm:rxjs@7.5.3/operators/package.json',
    'npm:devexpress-diagram@2.2.24/package.json',
    'npm:devexpress-gantt@4.1.64/package.json',
  ],
};
System.config(window.config);
// System.import('@angular/compiler').catch(console.error.bind(console));
// eslint-disable-next-line
const useTgzInCSB = ['openai'];
let packagesInfo = {
 "@angular/core": {
  "version": "17.3.12"
 },
 "core-js": {
  "version": "2.6.12"
 },
 "typescript": {
  "version": "5.4.5"
 },
 "zone.js": {
  "version": "0.14.10"
 }
};
    
    <!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
  <head>
    <title>DevExtreme Demo</title>
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0" />
    <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/25.1.6/css/dx.light.css" />
    <script src="https://cdn.jsdelivr.net/npm/core-js@2.6.12/client/shim.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/zone.js@0.14.10/bundles/zone.umd.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/reflect-metadata@0.1.13/Reflect.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/systemjs@0.21.3/dist/system.js"></script>
    <script src="config.js"></script>
    <script>
      System.import("app").catch(console.error.bind(console));
    </script>
  </head>
  <body class="dx-viewport">
    <div class="demo-container">
      <demo-app>Loading...</demo-app>
    </div>
  </body>
</html>
    
    [{
    "ID": 1,
    "CompanyName": "Premier Buy",
    "Address": "7601 Penn Avenue South",
    "City": "Richfield",
    "State": "Minnesota",
    "Zipcode": 55423,
    "Phone": "(612) 291-1000",
    "Fax": "(612) 291-2001",
    "Website": "http://www.nowebsitepremierbuy.dx"
}, {
    "ID": 2,
    "CompanyName": "ElectrixMax",
    "Address": "263 Shuman Blvd",
    "City": "Naperville",
    "State": "Illinois",
    "Zipcode": 60563,
    "Phone": "(630) 438-7800",
    "Fax": "(630) 438-7801",
    "Website": "http://www.nowebsiteelectrixmax.dx"
}, {
    "ID": 3,
    "CompanyName": "Video Emporium",
    "Address": "1201 Elm Street",
    "City": "Dallas",
    "State": "Texas",
    "Zipcode": 75270,
    "Phone": "(214) 854-3000",
    "Fax": "(214) 854-3001",
    "Website": "http://www.nowebsitevideoemporium.dx"
}, {
    "ID": 4,
    "CompanyName": "Screen Shop",
    "Address": "1000 Lowes Blvd",
    "City": "Mooresville",
    "State": "North Carolina",
    "Zipcode": 28117,
    "Phone": "(800) 445-6937",
    "Fax": "(800) 445-6938",
    "Website": "http://www.nowebsitescreenshop.dx"
}, {
    "ID": 5,
    "CompanyName": "Braeburn",
    "Address": "1 Infinite Loop",
    "City": "Cupertino",
    "State": "California",
    "Zipcode": 95014,
    "Phone": "(408) 996-1010",
    "Fax": "(408) 996-1012",
    "Website": "http://www.nowebsitebraeburn.dx"
}, {
    "ID": 6,
    "CompanyName": "PriceCo",
    "Address": "30 Hunter Lane",
    "City": "Camp Hill",
    "State": "Pennsylvania",
    "Zipcode": 17011,
    "Phone": "(717) 761-2633",
    "Fax": "(717) 761-2334",
    "Website": "http://www.nowebsitepriceco.dx"
}, {
    "ID": 7,
    "CompanyName": "Ultimate Gadget",
    "Address": "1557 Watson Blvd",
    "City": "Warner Robbins",
    "State": "Georgia",
    "Zipcode": 31093,
    "Phone": "(995) 623-6785",
    "Fax": "(995) 623-6786",
    "Website": "http://www.nowebsiteultimategadget.dx"
}, {
    "ID": 8,
    "CompanyName": "EZ Stop",
    "Address": "618 Michillinda Ave.",
    "City": "Arcadia",
    "State": "California",
    "Zipcode": 91007,
    "Phone": "(626) 265-8632",
    "Fax": "(626) 265-8633",
    "Website": "http://www.nowebsiteezstop.dx"
}, {
    "ID": 9,
    "CompanyName": "Clicker",
    "Address": "1100 W. Artesia Blvd.",
    "City": "Compton",
    "State": "California",
    "Zipcode": 90220,
    "Phone": "(310) 884-9000",
    "Fax": "(310) 884-9001",
    "Website": "http://www.nowebsiteclicker.dx"
}, {
    "ID": 10,
    "CompanyName": "Store of America",
    "Address": "2401 Utah Ave. South",
    "City": "Seattle",
    "State": "Washington",
    "Zipcode": 98134,
    "Phone": "(206) 447-1575",
    "Fax": "(206) 447-1576",
    "Website": "http://www.nowebsiteamerica.dx"
}, {
    "ID": 11,
    "CompanyName": "Zone Toys",
    "Address": "1945 S Cienega Boulevard",
    "City": "Los Angeles",
    "State": "California",
    "Zipcode": 90034,
    "Phone": "(310) 237-5642",
    "Fax": "(310) 237-5643",
    "Website": "http://www.nowebsitezonetoys.dx"
}, {
    "ID": 12,
    "CompanyName": "ACME",
    "Address": "2525 E El Segundo Blvd",
    "City": "El Segundo",
    "State": "California",
    "Zipcode": 90245,
    "Phone": "(310) 536-0611",
    "Fax": "(310) 536-0612",
    "Website": "http://www.nowebsiteacme.dx"
}]
    
    [
  {
    "ID": 1,
    "name": "Stores",
    "expanded": true
  },
  {
    "ID": "1_1",
    "categoryId": 1,
    "name": "Super Mart of the West",
    "expanded": true
  },
  {
    "ID": "1_1_1",
    "categoryId": "1_1",
    "name": "Video Players"
  },
  {
    "ID": "1_1_1_1",
    "categoryId": "1_1_1",
    "name": "HD Video Player",
    "price": 220
  },
  {
    "ID": "1_1_1_2",
    "categoryId": "1_1_1",
    "name": "SuperHD Video Player",
    "price": 270
  },
  {
    "ID": "1_1_2",
    "categoryId": "1_1",
    "name": "Televisions",
    "expanded": true
  },
  {
    "ID": "1_1_2_1",
    "categoryId": "1_1_2",
    "name": "SuperLCD 42",
    "price": 1200
  },
  {
    "ID": "1_1_2_2",
    "categoryId": "1_1_2",
    "name": "SuperLED 42",
    "price": 1450
  },
  {
    "ID": "1_1_2_3",
    "categoryId": "1_1_2",
    "name": "SuperLED 50",
    "price": 1600
  },
  {
    "ID": "1_1_2_4",
    "categoryId": "1_1_2",
    "name": "SuperLCD 55",
    "price": 1750
  },
  {
    "ID": "1_1_2_5",
    "categoryId": "1_1_2",
    "name": "SuperLCD 70",
    "price": 4000
  },
  {
    "ID": "1_1_3",
    "categoryId": "1_1",
    "name": "Monitors"
  },
  {
    "ID": "1_1_3_1",
    "categoryId": "1_1_3",
    "name": "19\""
  },
  {
    "ID": "1_1_3_1_1",
    "categoryId": "1_1_3_1",
    "name": "DesktopLCD 19",
    "price": 160
  },
  {
    "ID": "1_1_4",
    "categoryId": "1_1",
    "name": "Projectors"
  },
  {
    "ID": "1_1_4_1",
    "categoryId": "1_1_4",
    "name": "Projector Plus",
    "price": 550
  },
  {
    "ID": "1_1_4_2",
    "categoryId": "1_1_4",
    "name": "Projector PlusHD",
    "price": 750
  }
]