Cascader

A hierarchy picker that shows nested options one level at a time in side-by-side columns, or as a flat list of full paths while searching.

Default

The first column lists the roots, and each branch you open adds a column. Only the key is stored — the trigger caption rebuilds the full path ("Engineering / Platform / Runtime") from Items. Browsing without choosing is discarded when the popup closes, so the columns always reopen on the current value.
Typing replaces the columns with a flat list of full paths, so "platform / run" finds "Engineering / Platform / Runtime" without opening a single branch. Matching is case-insensitive against the joined path text. Results hold leaves only, unless ChangeOnSelect is on.

Selectable Branches

By default a branch is navigation only, so the value is always a leaf. Turn on ChangeOnSelect and clicking a branch selects it and opens its column, so "Engineering" is a valid answer and the user can still drill deeper. Only a leaf closes the popup.

No Search and Disabled

With ShowSearch="false", focus starts on the selected item instead of a search box — use the arrow keys to move within and between levels. A disabled cascader keeps the selected path visible but cannot be opened, and its hidden input is not submitted.

Inside an EditForm

ValueExpression comes from @bind-Value, so every change notifies the EditContext and the trigger picks up aria-invalid while the field has messages. Required only sets aria-required — use a model attribute to actually enforce the value.