Ok, I've figured this out, or at least worked around it.
My Calendar was in Resources View Mode, and I was defining the columns declaritively in the ASP.NET markup rather than dynamically in the code behind. I had HeaderLevels set to 1, so and each column was for a different resource.
It seems that because the columns in the Calendar represented resources and not dates, when I was navigating between days and data binding, the Calendar didn't think anything had changed so there was no new data to bind. In other words, because the Calendar wasn't displaying any date information in any column heading, changing the Calendar's Start Date didn't actually seem to do anything.
I've gotten around this by setting HeaderLevels to 2, and defining a parent column showing the date and child columns showing the resources, as per the Days Resources View demo on the website (the code is in the downloadable solution). Because I now assign each Resource column a date and/or because I now call the method to define the columns each time a new date is navigated to, the grid now updates as expected.
Thought I'd post this here in case somebody else is struggling with the same problem.