My notesPractical Power BI tips
DAX filter context: the measure has no row

The measure has no row. That one sentence captures the confusion that trips up almost every DAX beginner: the idea that a measure knows where it lives in a report. Which visual it is in. Which row it sits above. Which slicer is active on the page. It knows none of that.
What a measure does know: it sees the table that remains after filter context has been applied, and it runs its expression against that remaining table. Filter context is the complete set of filters in place at the moment the DAX expression evaluates. Those filters are not set by the measure itself; they are imposed from outside, by the location where the measure lands.
To make this concrete, I use a single anchor measure throughout: [Order count] := COUNTROWS(Orders). The same expression, placed in three different locations.
The visual decides which table the measure sees
Place [Order count] in a card visual and you get the total number of orders in the model. No fields on axes, no dimensions on rows; the filter context is unrestricted. The measure sees all orders and counts them.
Put that same measure in a table with Region[Region] on the rows, and the measure re-evaluates for each row, against the subset of orders that the region name defines. The North row gets the North orders; the South row gets the South orders. The measure itself has not changed at all; only the table the visual leaves behind is different per row. That is filter context in its most direct form: the visual decides which table the measure works with before it starts counting.
The slicer adds another filter on top
Add a slicer on Date[Year] to the report page and select 2025. The same [Order count] changes again, in every visual on the page that can filter on date. The measure still knows nothing about “2025”; the filter context at evaluation time now simply contains an additional filter, Date[Year] = 2025, on top of whatever the visual already contributes. Card, table, matrix: all of them now see a smaller source table, and the measure counts what remains.
This is also why a slicer change sometimes produces an unexpected result: if one visual does not respond to the slicer, it often points to a missing relationship in the model, or to a visual-level filter on that column that overrides the slicer. Filter context is always a composition of multiple layers.
The row in a matrix gives each cell its own context
Place the same measure in a matrix with Region[Region] on the row axis and Date[Year] on the column axis. Every cell re-evaluates the measure with its own filter context, built from the row, the column, the slicer, and the page together. The South × 2025 cell has filter context {Region = South, Year = 2025}, and COUNTROWS(Orders) sees only the orders that satisfy both filters. The same expression produces a different result per cell, with no changes to the measure.
This is also why matrix totals sometimes surprise people: the total row evaluates the measure without the row filter, so you see the column total rather than the sum of the individual rows, which gives a different number for non-additive measures.
Where to look in Power BI Desktop when a number surprises you
Once this clicks, the first question you ask when a visual shows an unexpected number shifts from “what is my measure doing?” to “what filters are actually on this visual?”. In Power BI Desktop, you can answer that question directly.
Click on the visual. Open the “Filters on this visual” pane and check which filters the visual contributes. Then look at “Filters on this page” for page-level filters and slicer selections. If those two panes together explain the source table your measure is working with, the number makes sense. If not, check whether cross-filtering from another visual on the page is adding more.
Four steps that help in every troubleshooting session: check the visual filters, check the page filters, check the slicers, and check for cross-filter influence from other visuals on the page.
CALCULATE and what comes next
CALCULATE is the function that lets you modify filter context from inside the expression: add filters, remove them, or replace them, without touching the visual or the slicer. That is the next step after understanding filter context, and the focus of the series that follows this post: FILTER, ALL, REMOVEFILTERS, ALLEXCEPT and ALLSELECTED.
Want to work through the DAX basics series together, or do you have a question about filter context in your own report? Visit trainerbjorn.nl or get in touch.