Хороший вопрос. И, к сожалению, это не так просто сделать, как хотелось бы:
Если вы просто хотите, чтобы переключатель «Удалить» был скрыт, а не отключен, вы можете заменить <xforms:item>
для «Удалить» на <xforms:itemset ref="…">
, который вы привязываете к узлу, который вы делаете неактуальным, когда вы хотите, чтобы этот переключатель не отображался . Но вы не можете использовать ту же технику, чтобы отключить переключатель, привязав набор элементов к узлу, который вы сделаете доступным только для чтения. (И да, было бы хорошо, если бы вы могли это сделать.)
В нынешнем виде, я думаю, вам нужно:
- Создайте 2
<xforms:select1>
. Один для «Добавить», один для «Удалить», так что вы можете сделать второй только для чтения при некоторых условиях.
- Чтобы сделать его доступным только для чтения, но не позволять «Добавить» только для чтения, вам нужно привязать их к 2 отдельным узлам.
- Если вы хотите иметь 1 узел с A или D, вам нужно создать вычисление для заполнения этого узла на основе 2 значений.
- Вы хотите, чтобы значения были исключительными, и они не будут, если у вас есть два
<xforms:select1>
, поэтому вам нужно отменить выбор «удалить», когда выбрано «добавить», реагируя на xforms-select
, и наоборот.
В модели у вас будет:
<xforms:instance>
<instance>
<add/>
<delete/>
<add-delete/>
<delete-enabled>true</delete-enabled>
</instance>
</xforms:instance>
<xforms:bind ref="add-delete" calculate="string-join((../add, ../delete), ' ')"/>
<xforms:bind ref="delete" readonly="../delete-enabled = 'false'"/>
И в представлении:
<xforms:select1 ref="instance()/add" appearance="full">
<xforms:item>
<xforms:label>Add</xforms:label>
<xforms:value>A</xforms:value>
</xforms:item>
<xforms:setvalue ev:event="xforms-select" ref="instance()/delete"/>
</xforms:select1>
<xforms:select1 ref="instance()/delete" appearance="full">
<xforms:item>
<xforms:label>Delete</xforms:label>
<xforms:value>D</xforms:value>
</xforms:item>
<xforms:setvalue ev:event="xforms-select" ref="instance()/add"/>
</xforms:select1>
Полный исходный код этого примера см. в этой сути.
person
avernet
schedule
15.11.2011