2012-04-03 15 views
5

¿Cuál es la forma más corta de Xamly de hacer que un contenido de ToggleButton dependa de su estado verificado?ToggleButton/CheckBox contenido dependiendo de su estado verificado?

En WPF Probablemente vaya por un DataTrigger que no existe en Silverlight.

Intenté lo siguiente, pero no funciona, tan pronto como incluyo los desencadenadores, la unión a la fuente se interrumpe. Los disparadores no funcionarán de todos modos.

<ToggleButton 
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
IsChecked="{Binding IsArchived, Mode=TwoWay}"> 
    <i:Interaction.Triggers> 
    <i:EventTrigger EventName="Checked"> 
     <ei:ChangePropertyAction 
     TargetObject="{Binding 
     RelativeSource={RelativeSource AncestorType=ToggleButton}}" 
     PropertyName="Content" Value="Unarchive project"/> 
    </i:EventTrigger> 
    <i:EventTrigger EventName="Unchecked"> 
     <ei:ChangePropertyAction 
     TargetObject="{Binding 
     RelativeSource={RelativeSource AncestorType=ToggleButton}}" 
     PropertyName="Content" Value="Archive project"/> 
    </i:EventTrigger> 
    </i:Interaction.Triggers> 
</ToggleButton> 
+0

Mi propio camino no podía considerarse como definitiva, por lo que estoy publicar un comentario como: anular la plantilla ToggleButton, usar dos cuadro de texto, establezca su propiedad visiblity de usar el VisualStateManager. – jv42

+0

@ jv42, eso no afectará el control en el primer salto, solo cuando se modifique después del renderizado, vea [mi respuesta] (http://stackoverflow.com/a/9989048/75500) que lo resuelve también. – Shimmy

+0

Nunca tuve problemas con eso. Tal vez me perdí algo. – jv42

Respuesta

4
<ToggleButton Width="50" Height="50"> 
    <ToggleButton.Content> 
     <TextBlock x:Name="obj" Text="Foo"/> 
    </ToggleButton.Content> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="Checked"> 
      <ei:ChangePropertyAction PropertyName="Text" Value="On" TargetName="obj"/> 
     </i:EventTrigger> 
     <i:EventTrigger EventName="Unchecked"> 
      <ei:ChangePropertyAction PropertyName="Text" Value="Off" TargetName="obj"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</ToggleButton> 
+0

Eché un vistazo al código fuente de ChangePropertyAction, y usa la combinación de TypeConverter y reflection SetValue, y de alguna manera se confunde con el hecho de que el contenido es Object y usted configura String para ello. Decidí no dedicarle tiempo. para entender este código en detalles) –

1

Terminé usando Kent Boogaart 's converter, funciona muy bien, y también depende de la propiedad ligada, no en un disparador de control que podría no disparar a todos (en un caso en el que la propiedad wasn 't realmente establecido), aquí está el código:

<ToggleButton.Content> 
    <Binding Path="IsArchived" 
    xmlns:boo="http://schemas.kent.boogaart.com/converters" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
    <Binding.Converter> 
     <boo:MapConverter> 
     <boo:Mapping To="Archive project"> 
      <boo:Mapping.From> 
      <sys:Boolean>false</sys:Boolean> 
      </boo:Mapping.From> 
     </boo:Mapping> 
     <boo:Mapping To="Unarchive project"> 
      <boo:Mapping.From> 
      <sys:Boolean>true</sys:Boolean> 
      </boo:Mapping.From> 
     </boo:Mapping> 
     </boo:MapConverter> 
    </Binding.Converter> 
    </Binding> 
</ToggleButton.Content> 
+0

Yo personalmente pondría esta LÓGICA en viewModel, en lugar de excavar en XAML. Es menos código y hace que tus intenciones sean visibles. Odio leer a mis compañeros de equipo XAML buscando lógica oculta dentro de él. Si trabajas solo eso está bien, sin embargo. –

+0

@AlexBurtsev No estoy de acuerdo. Esto es asunto de la capa de Vista, no de ViewModel, cuyo deber es exponer una propiedad 'IsArchived' al igual que lo hace y permanecer independiente de la IU. – Shimmy

+1

Puede ser de cualquier manera, dependiendo de su uso del patrón VM. Se trata de si los conversores de do viven en XAML o VM, prefiero el segundo, cuando VM proporciona una vista con datos listos para usar. En parte es porque las capacidades de los convertidores "externos" a menudo son limitadas. –

Cuestiones relacionadas