[4.7.6] How to programmatically change properties on components in the editor using C++?

I have a framework that I was hoping to base on the component attachment tree. I want to provide some visualization while in the editor of what the end result will be, so I want modifying a property in the editor on one component to be able to modify properties of other components within the tree. For instance, if someone clears the Visible checkbox on a component, it would recurse through the children and clear their Visibility as well. Although this works in game, I can’t get it to work in the editor.

What I have tried is setting up a PostEditChangeProperty, which then calls my change function. The change function applies the change to the children, but then the entire blueprint editor instance gets reconstructed, and the archetype the instance is created from does not have the change on the other components, just the one specifically edited by the user. I thought I stumbled on the solution with PreEditChange/PostEditChange, but that didn’t do it.

If you could take a look at my sample code and point out the missing pieces that would be very helpful.

MyActorComponent.h:

#pragma once

#include "Components/ActorComponent.h"
#include "MyActorComponent.generated.h"

UENUM( BlueprintType )
namespace EState
{
	enum Type
	{
		State1,
		State2,
		State3,
	};
}

UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class COMPONENTPROPS_API UMyActorComponent : public USceneComponent
{
	GENERATED_BODY()

public:	
#if WITH_EDITOR
	virtual void PostEditChangeProperty( FPropertyChangedEvent& PropertyChangedEvent ) override;
#endif

	UFUNCTION( BlueprintCallable, Category = Default )
	void SetCurrentState( EState::Type InState );
	void SetCurrentStateRecursive( EState::Type InState );

	UPROPERTY( Category = Default, EditAnywhere, BlueprintReadWrite )
	TEnumAsByte< EState::Type > CurrentState;
};

MyActorComponent.cpp

#include "ComponentProps.h"
#include "MyActorComponent.h"

void UMyActorComponent::SetCurrentState( EState::Type InState )
{
	SetCurrentStateRecursive( InState );
}

void UMyActorComponent::SetCurrentStateRecursive( EState::Type InState )
{
	CurrentState = InState;

	// Set the state of all child vrui.
	TArray< USceneComponent* > children;
	GetChildrenComponents( false, children );
	for( auto childComp : children )
	{
		UMyActorComponent* myComp = Cast< UMyActorComponent >( childComp );
		if( myComp )
		{
#if WITH_EDITOR
			myComp->PreEditChange( NULL );
#endif // WITH_EDITOR
			myComp->SetCurrentStateRecursive( InState );
#if WITH_EDITOR
			myComp->PostEditChange( );
#endif // WITH_EDITOR
		}
   	}
}

#if WITH_EDITOR
void UMyActorComponent::PostEditChangeProperty( FPropertyChangedEvent& PropertyChangedEvent )
{
	EState::Type newState = CurrentState;

	static const FName NAME_CurrentState = TEXT( "CurrentState" );
	UProperty* PropertyThatChanged = PropertyChangedEvent.Property;
	if( PropertyThatChanged )
	{
		const FName PropertyName = PropertyThatChanged->GetFName( );

		if( PropertyName == NAME_CurrentState )
		{
			SetCurrentState( newState );
		}
	}

	Super::PostEditChangeProperty( PropertyChangedEvent );
}
#endif