the only way I found to do this is by recursively check all the child programmatically.
There’s this article in the KB that might help (but it check the parent, if all childs are checked)
I did a class that encapsulate that exact behavior, check the parent, it check all the childs, uncheck the child will put the parent to indetermine state, check all child => check the parent.
So I suggest that you make a class that derive from UltraTree and that implement that exact behavior and uses that class in your app.
hope it helps