2009-10-07 12 views
20

Desidero utilizzare un WPF ToggleButton per espandere e comprimere alcuni controlli nella mia applicazione. Come posso usare XAML per realizzare questo?Collegamento a uno stato IsChecked di ToggleButton di WPF

Sto pensando che potrei in qualche modo associare l'attributo Visibility di alcuni controlli allo stato IsChecked di ToggleButton, ma non so come farlo.

Forse ho bisogno di dare il mio ToggleButton a Name, quindi eseguire il binding utilizzando ElementName? Quindi avrei bisogno di un ValueConverter per la conversione tra un valore booleano e una visibilità, corretto? Come posso creare un generico ValueConverter per questo scopo?

+6

Non è necessario: è già nel framework. Cerca BooleanToVisibilityConverter. – itowlson

risposta

39

È necessario associare il Visibility attraverso un convertitore:

<Window 
    x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Window.Resources> 
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/> 
    </Window.Resources> 
    <StackPanel> 
    <ToggleButton x:Name="toggleButton" Content="Toggle"/> 
    <TextBlock 
     Text="Some text" 
     Visibility="{Binding IsChecked, ElementName=toggleButton, Converter={StaticResource BooleanToVisibilityConverter}}"/> 
    </StackPanel> 
</Window> 

In Silverlight non c'è BooleanToVisibilityConverter ma è facile scrivere il proprio con alcune funzioni aggiunte :

using System; 
using System.Globalization; 
using System.Windows; 
using System.Windows.Data; 

namespace WpfApplication1 { 

    public class BooleanToVisibilityConverter : IValueConverter { 

    public Object Convert(Object value, Type targetType, Object parameter, CultureInfo culture) { 
     if (targetType == typeof(Visibility)) { 
     var visible = System.Convert.ToBoolean(value, culture); 
     if (InvertVisibility) 
      visible = !visible; 
     return visible ? Visibility.Visible : Visibility.Collapsed; 
     } 
     throw new InvalidOperationException("Converter can only convert to value of type Visibility."); 
    } 

    public Object ConvertBack(Object value, Type targetType, Object parameter, CultureInfo culture) { 
     throw new InvalidOperationException("Converter cannot convert back."); 
    } 

    public Boolean InvertVisibility { get; set; } 

    } 

} 

Ora si c un specificare un convertitore che associa true a Collapsed e false-Visible: "Come potrei fare un ValueConverter generico per questo scopo"

<BooleanToVisibilityConverter 
    x:Key="InverseBooleanToVisibilityConverter" InvertVisibility="True"/> 
+0

Credo che dovrebbe anche essere possibile utilizzare i trigger in modo simile, a la http://stackoverflow.com/questions/250840/how-do-you-bind-the-textwrapping-property-of-a-textbox- to-the-the-iskecked-value-of –

+0

che ha funzionato come fascino. grazie martin –

0

C'è un motivo per cui non si sta semplicemente utilizzando il Expander? Si basa comunque su ToggleButton.

+0

Sto facendo molto più che espandermi e crollare - sto riorganizzando i contenuti. Ad esempio, mi piacerebbe impostare l'Orientamento di StackPanel e le proprietà TextWrapping e FontSize di TextBlock. Non ho specificato questo poiché volevo mantenere la domanda semplice. –

+0

Abbastanza corretto :-) Dovresti essere in grado di eseguire il binding con {binding elementname = mytoggle, propertyname = checked} o anche utilizzare un trigger sul commutatore per impostare lo stile dei target. –

8

Utilizzare la BooleanToVisibilityConverter:

<BooleanToVisibilityConverter x:Key="bvc" /> 
<TextBlock Visibility="{Binding IsChecked, ElementName=toggle, Converter={StaticResource bvc}}" /> 
Problemi correlati