Tutorials/Power Apps/Creating Dependent Dropdown Menus in Power Apps
Power Appsintermediate

Creating Dependent Dropdown Menus in Power Apps

Guide to building cascading dropdowns that limit choices based on prior selections, with step-by-step implementation.

NA
Narmer Abader
@narmer · Published June 3, 2026

Cascading dropdowns, also called dependent dropdowns, guide users through a series of choices where each selection restricts the next. For example, selecting a product category limits the available suppliers, and then choosing a supplier shows only the products they offer. This approach reduces errors and simplifies data entry in Power Apps.

Building an Office Supply Ordering App

Consider an internal app for ordering office supplies. Employees pick a category, then a supplier, and finally a specific product. The catalog data lives in a SharePoint list called Catalog with these columns:

  • Category (text)
  • Supplier (text)
  • Product (text)

Sample data in the list:

CategorySupplierProduct
PaperStaplesA4 copy paper 500 sheets
PaperStaplesPremium glossy paper
PaperOfficeMaxA4 recycled paper
PensPilotG2 gel pen blue
PensPilotG2 gel pen black
PensSharpiePermanent marker fine point
FurnitureIkeaStanding desk
FurnitureIkeaTask chair
FurnitureOfficeMaxDesk lamp LED

A second SharePoint list, Orders, stores completed requests with columns for Category, Supplier, and Product (plus the built-in Created By and Created columns).

Setting Up the App

  1. In Power Apps Studio, start a blank app.
  2. Connect both SharePoint lists as data sources.
  3. Add three label + dropdown pairs: Category, Supplier, and Product. Name them ddlCategory, ddlSupplier, and ddlProduct.
  4. Add a Submit button.

Populating the Dropdowns

Category Dropdown – Distinct Values

The first dropdown shows every unique category. Use Distinct to avoid duplicates.

powerfxItems property of ddlCategory
Distinct(Catalog, Category)

Supplier Dropdown – Filtered by Selected Category

The second dropdown displays only suppliers that belong to the chosen category. Combine Filter and Distinct.

powerfxItems property of ddlSupplier
Distinct(
  Filter(Catalog, Category = ddlCategory.Selected.Value),
  Supplier
)

Product Dropdown – Filtered by Both Category and Supplier

The third dropdown shows products matching both prior selections. This prevents errors if the same supplier name appears under multiple categories.

powerfxItems property of ddlProduct
Filter(
  Catalog,
  Category = ddlCategory.Selected.Value && Supplier = ddlSupplier.Selected.Value
)

Now the dropdowns cascade. But we need three more refinements: blank defaults, resets on parent change, and disabled child dropdowns.

Adding Blank Options

Without a blank option, child dropdowns automatically show the first filtered item when a parent changes, which is confusing. Prepend a blank row using Ungroup and Table.

powerfxItems of ddlCategory (with blank)
Ungroup(
  Table(
      {Value: Blank()},
      {Value: Distinct(Catalog, Category)}
  ),
  "Value"
)
powerfxItems of ddlSupplier (with blank)
Ungroup(
  Table(
      {Value: Blank()},
      {Value: Distinct(
          Filter(Catalog, Category = ddlCategory.Selected.Value),
          Supplier
      )}
  ),
  "Value"
)
powerfxItems of ddlProduct (with blank)
Ungroup(
  Table(
      {Value: Blank()},
      {Value: Filter(
          Catalog,
          Category = ddlCategory.Selected.Value && Supplier = ddlSupplier.Selected.Value
      )}
  ),
  "Value"
)

Set the Default property of each dropdown to Blank().

Resetting When Parent Changes

When a category changes, the supplier and product dropdowns should clear. Likewise, changing the supplier clears the product.

Add this to the OnChange property of ddlCategory:

powerfxOnChange of ddlCategory
Reset(ddlSupplier);
Reset(ddlProduct);

Add this to OnChange of ddlSupplier:

powerfxOnChange of ddlSupplier
Reset(ddlProduct);

Disabling Dropdowns Until Previous Selection

Prevent users from selecting a supplier before a category is chosen. Set the DisplayMode property of ddlSupplier:

powerfxDisplayMode of ddlSupplier
If(
  IsBlank(ddlCategory.Selected.Value),
  DisplayMode.Disabled,
  DisplayMode.Edit
)

Similarly for ddlProduct:

powerfxDisplayMode of ddlProduct
If(
  IsBlank(ddlSupplier.Selected.Value),
  DisplayMode.Disabled,
  DisplayMode.Edit
)

Saving the Order to a SharePoint List

Add a Submit button and place this code in its OnSelect:

powerfxOnSelect of Submit button
// Save order to the Orders list
Patch(
  Orders,
  Defaults(Orders),
  {
      Category: ddlCategory.Selected.Value,
      Supplier: ddlSupplier.Selected.Value,
      Product: ddlProduct.Selected.Value
  }
);
// Reset all dropdowns for the next entry
Reset(ddlCategory);
Reset(ddlSupplier);
Reset(ddlProduct);

Performance and Delegation Considerations

When your SharePoint list exceeds 2,000 items, Distinct and Filter may only return the first batch unless you apply additional filters or switch to a delegation‑safe source like Dataverse or SQL. For moderate lookup tables, the pattern above works well; for larger catalogs, consider a different data source.

Common Mistakes and Troubleshooting

  • Filtering not working: Verify column names exactly match your SharePoint list. Use .Value when referencing a text column from a dropdown: ddlCategory.Selected.Value.
  • Resets have no effect: Ensure the child dropdown’s Default property is Blank(). The Reset function returns the control to its default value.
  • Child dropdowns not clearing on parent change: Did you add the Reset calls to the parent’s OnChange?
  • Blank option missing: The Ungroup trick requires the inner table to have a column named Value. If your data source column has a different name, wrap it accordingly.

Final Recommendation

Cascading dropdowns are a simple but powerful pattern to constrain user input. By combining Distinct, Filter, Ungroup, and Reset, you can build a smooth, error‑proof selection experience. Always test with your actual data volume and adjust for delegation if needed.

References