Interacciones Wix con condiciones, propiedades y acciones personalizadas

Tengo un problema con la configuración del estado habilitado de un botón en un cuadro de diálogo. El botón en cuestión se define como:

 Validated = 0 <![CDATA[Validated  0]]> 1  

La propiedad Validated comienza con un valor inicial de 0 y, como se espera, el siguiente botón se desactiva.

  

La propiedad en sí se modifica mediante una acción personalizada en otro botón.

  1  

Con una versión simplificada de la acción personalizada como:

 [CustomAction] public static ActionResult ValidateDatabase(Session session) { session.Log("Begin ValidateDatabase"); session["Validated"] = "1"; return ActionResult.Success; } 

El problema al que me enfrento es que el botón Siguiente no se vuelve a habilitar después de que se haya ejecutado la Acción personalizada. Puedo confirmar que la CA se ejecuta y que la propiedad se configuró correctamente. La IU se actualizará si realizo alguna otra acción que haga que se actualice, por ejemplo, retroceda una página y luego vuelva a esta página y se habilitará el botón Siguiente.

¿Alguna idea sobre cómo actualizar un estado de botones después de una acción personalizada?

http://www.mail-archive.com/wix-users@lists.sourceforge.net/msg05097.html ofrece una solución para volver a publicar las propiedades que se cambiaron en la acción personalizada inmediatamente después.

Aquí hay un ejemplo de cómo lo he hecho funcionar en mi código:

              "" AND CONNECTION_STRING_VALID = "1"]]>    1    Please enter database configuration    {\WixUI_Font_Title}Database Settings    1 1       

CustomAction establece el valor de CONNECTION_STRING_VALID en 1 o 0 dependiendo de si es válido o no y he definido en otro lugar que por defecto su valor es 0

  

Ahora cuando hago clic en mi botón de verificación si la cadena es válida, el siguiente botón está habilitado

Esta es una limitación bien conocida de Windows Installer. El estado del diálogo no cambia hasta que lo actualice de otra manera, por ejemplo, retrocediendo y retrocediendo, como mencionó correctamente.

La solución aquí es tener dos diálogos idénticos, DialogA y DialogB. El botón PerformValidation en DialogA realizará la validación como lo hace ahora mismo y llamará a DialogB (como NewDialog). De la misma manera, el botón PerformValidation en DialogB también realizará la validación y llamará a DialogA. Por lo tanto, tendrá que cargar los cuadros de diálogo cada vez que ejecute la validación y el estado del botón se mostrará correctamente. El usuario no sospechará nada, porque solo verá el mismo diálogo. 🙂

La idea se describe mejor en detalle aquí . Se llama “diálogos gemelos”.

Espero que esto ayude.