The above solution (reading the ExtendedProperties and storing in a dataset) is the solution I implemented. Instead of using multiple rows in the dataset, I chose to use a single-row, multiple column format. Once the data was in the dataset, I was able to use the column name directly from the Expression language including a fail-over value.
To populate the dataset and provide a fail-over empty dataset to the custom parameter:
The script as attached to the Template:
def getUdtParameters(self, udtPath):
udtPath=str(udtPath) or ‘’
path = “%s.ExtendedProperties” % udtPath
props = system.tag.read(path)
if props.value is not None:
for prop in props.value:
Typical expression binding using the dataset of extended properties:
Not bullet-proof, but seems to be reasonably robust. No errors when binding hasn't been fully updated on initial load of the windows. Using the UDT tagPath as string and indirect references has lightened the load tremendously. The as-packaged template is loading quickly and responds well even when on a window with many controls and 8 of these templates viewed remotely through an encrypted connection.
Thanks to all that provided guidance.