Normally for valueChangeListener, the onchange="this.form.submit()" is needed. Since you don't the form to submit, try to the f:ajax tag to do the same thing. Remember to use the proper execute and render attributes.
AJAX does not avoid an HTTP submit, it merely constrains the data that is sent and received and keeps the same page (document) in the client. So the actual operation of valueChangeListener remains the same, whether it's a full-form submit or a partial submit.
Web browser windows are not the same thing as stand-alone desktop application windows, nor are HTTP protocols as interactive as general-purpose client-server protocols. This is by design, since the traditional client-server protocols did not have to endure the longer delays that occur over the Internet or the fact that the Internet can route requests through unpredictable channels.
What that means specifically, is that a "valueChangeListener" is NOT something that fires on the client when a value changes. It is something that gets invoked on the server when data is submitted to the server and the data coming in doesn't match what JSF saw going out when the page was previously rendered. Furthermore, the JSF lifecycle rules state that if ANY of the incoming submitted data value is invalid, the incoming request will be short-circuited: the listeners will not be invoked, the data will not be updated and the action method/listener or AJAX listener will not be invoked. JSF will only process a request when all incoming data is valid.
An IDE is no substitute for an Intelligent Developer.