I had this exact problem when doing some logic in the PreviewMouseDown handler of the Button. Putting the logic on the dispatcher solved it for me because that would allow the LostFocus event to cause a binding update before my button logic would execute.