First, I don't think you are over simplifying it. It is a simple concept.
Commands tell your application to do something.
Events announce to the world that you did something.
If your application can't do what it is told to do (because of business rules or some other reason) It doesn't do it. And in turn doesn't announce anything. If it does do something then it announces it via an event.
If anyone is subscribed to those events, and care when they occur, then they can update their application with the data in the event.
In practice this generally means your read model subscribes to the events and updates itself accordingly.
Take creating a User. You issue a User_CreateCommand which contains information about a user. The command handler would then create a new object, that object being a User, and save it to the repository. Creating the user fires a User_CreatedEvent which will be handled by your read model and the read model will be updated. Any other systems listening can update themselves as well.
The part that takes a little bit of study is the fact that when you save your User to the repository, you aren't actually saving a User Object like you might think. You are actually saving the User_CreatedEvent which contains all of the data about the user.
Later, when you need your user object you would call something like _repo.GetById(1);
This would then replay all of the events dealing with that user and create the user object.
Hope that helps :)