We put some data validation in PostEditChangeProperty which fixes up a property when another property is modified. Basically, property B’s validity is dependent on property A.
When property B is modified in PostEditChangeProperty, however, it does not update the actual display in the details window. I assume that there might be some kind of dirty flag needs to be set, or maybe even invalidate the entire layout, but I can’t figure out how to do so.
These properties happen to be GameplayTagContainers.
I’m having the same problem.
If PostEditChangeProperty is triggered because of a change on value A, it seems like A is the only value I can modify. (I want to modify B)
I’ve searched quite a bit online, but I haven’t found any answer.
Even code in unreal has this problem. The UI Sequencer → Render Movie Settings → Burn in Options → Settings has this same issue when toggling between burn in classes in 4.21
I’ve been able to work around this by using a timer inside PostEditChangeProperty to update my uproperty. In my case, I null out the property in PostEditChangeProperty, then set a new value in the callback. It would be nice if there was some way to do this without a timer, as it feels like a hack.
I had this problem, and the solution for me was to call through to Super::PostEditChangeProperty(PropertyChangedEvent)after making my change to the other value instead of doing that before making my change.
I know this was posted a while ago, but in case anyone else ends up here, I just managed to get this working by overloading these three methods, and performing the update before calling into Super:
However, I ran into issues, where in my case I was assigning a dynamic material instance to the Class Default Object’s static mesh whenever I updated the Blueprint Default. This would cause a Save error to the instances in the editor, (something along the lines of referencing an external private property instance).
I added the following flag check to make sure I wasn’t doing it on the CDO. (Checking owner as this was a actor component).
if (GetOwner() && GetOwner()->HasAnyFlags(RF_ClassDefaultObject)) return;