2012-04-03 10 views
5

Qual è il modo xamly più breve per rendere un contenuto di ToggleButton dipendente dal suo stato selezionato?ToggleButton/CheckBox contenuto a seconda del suo stato controllato?

In WPF probabilmente andrei per un DataTrigger che non esiste in Silverlight.

Ho provato quanto segue, ma non funziona, non appena includo i trigger, il legame con l'origine è interrotto. I trigger non funzioneranno comunque.

<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

mio modo non si è qualificata più breve, quindi sto distacco come un commento: sovrascrivere il template ToggleButton, utilizzare due TextBox, impostare la loro proprietà della visibilità del usando il VisualStateManager. – jv42

+0

@ jv42, che non influirà sul controllo al primo limite, solo se modificato dopo il rendering, vedere [risposta] (http://stackoverflow.com/a/9989048/75500) che risolve anche questo. – Shimmy

+0

Non ho mai avuto problemi con quello. Forse mi sono perso qualcosa. – jv42

risposta

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

Ho dato un'occhiata al codice sorgente di ChangePropertyAction e utilizza la combinazione di TypeConverter e reflection SetValue e in qualche modo interferisce con il fatto che il contenuto è Object e si imposta String. Ho deciso di non passare del tempo per comprendere questo codice in dettaglio) –

1

ho finito per usare Kent Boogaart s' converter, funziona alla grande, ed è anche dipendente della proprietà limite, non su un trigger di controllo che potrebbe non sparare a tutti (nel caso in cui la proprietà wasn 't realmente set), ecco il codice:

<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

Personalmente inserirò questa LOGIC in viewModel, invece di aprirlo in XAML. È meno codice e rende visibili le tue intensità. Odio leggere i miei compagni di squadra XAML alla ricerca di logica nascosta al suo interno. Se lavori da solo va bene, però. –

+0

@AlexBurtsev Non sono d'accordo. Questo è importante per il livello View, non per ViewModel, il cui dovere è di esporre una proprietà 'IsArchived' proprio come fa e rimane agnostica dell'interfaccia utente. – Shimmy

+1

Può essere in qualsiasi modo, a seconda dell'utilizzo del pattern VM. Si trattava del fatto che i convertitori vivessero in XAML o VM, preferisco il 2 °, quando VM fornisce la visualizzazione con dati pronti all'uso. In parte perché le capacità dei convertitori "esterni" spesso sono limitate. –