I don’t know the answer to Item 3, as for the others…
ITEM 1: I think a multicast delegate is what you want here. Note that BlueprintImplementableEvents can be best seen as virtual functions as opposed to actual event dispatchers. You declare a function in C++, but you implement or override the function body in blueprint. What you want is an event dispatcher that anyone can subscribe to right? If so, look into UE4 delegates. You can create a BlueprintAssignable multicast delegate in C++ like this:
DECLARE_DYNAMIC_MULTICAST_DELEGATE( FMyEventSignature );
class AMyActor : public AActor
In any function in MyActor.cpp:
So what this setup does is, whenever is called any event bound to it is fired. For events with parameters, look up more info about multicast delegates. The cool thing is, by making it blueprint assignable you can bind blueprint events to it by calling dragging a pin off MyActor and choosing “Assign to MyEventDispatcher” or “Bind Event to MyEventDispatcher”. Here is a snapshot from my project where I declared a delegate in C++ called OnTeamChange and bind a blueprint event to it from a widget.
ITEM 2: Definitely! If your widget blueprint has a variable of a UCLASS type, like a pointer to an actor or actor component and that class has UPROPERTIES that are blueprint accessible (BlueprintReadOnly or BlueprintReadWrite), then you can bind them to widget elements. For example if you have a variable of type MyActor and MyActor has a blueprint accessible float UPROPERTY, then you can bind that to say, the Percent value of a ProgressBar widget element.