Почему в некоторых классах я должен указать этот конструктор, чтобы вызвать обратный вызов?
_timer = new DispatcherTimer(DispatcherPriority.Normal, Application.Current.Dispatcher);
Вместо просто:
_timer = new DispatcherTimer();
Конструктор по умолчанию будет использовать текущий Диспетчер вместо Диспетчера текущего приложения. Если это вызывается в потоке, отличном от потока пользовательского интерфейса, первая перегрузка необходима для получения правильного контекста синхронизации.