2009-10-07 12 views
20

Chciałbym użyć WPF ToggleButton, aby rozwinąć i zwinąć niektóre kontrolki w mojej aplikacji. Jak mogę użyć XAML, aby to osiągnąć?Powiązanie z włączonym stanem przełącznika WPF ToggleButton

Myślę, że mogłem jakoś związać atrybut Visibility niektórych kontrolek ze stanem ToggleButton 's, ale nie wiem jak to zrobić.

Może powinienem podać mój ToggleButton a Name, a następnie powiązać za pomocą ElementName? Wtedy potrzebowałbym ValueConverter do konwersji między wartością boolowską a widocznością, prawda? Jak mogę zrobić generic ValueConverter w tym celu?

+6

Nie musisz: jest już w ramach. Szukaj BooleanToVisibilityConverter. – itowlson

Odpowiedz

39

Musisz powiązać Visibility przez konwerter:

<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> 

Silverlight nie ma BooleanToVisibilityConverter ale łatwo jest napisać własną z kilkoma dodatkowymi funkcjami :

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; } 

    } 

} 

Teraz jesteś określić konwerter, który mapuje true do Collapsed i false do Visible: „Jak mogłem zrobić rodzajowe ValueConverter do tego celu”

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

Uważam, że powinno być również możliwe użycie wyzwalaczy w podobny sposób, a la http://stackoverflow.com/questions/250840/how-do-you-indh-the-tapewrapping-property-o--textbox- na-wartość-sprawdzoną-z –

+0

która działała jak wdzięk .. dziękuję za oknem –

0

Czy istnieje powód, dla którego nie używasz tylko Expander? W każdym razie opiera się na ToggleButton.

+0

Robię coś więcej niż tylko rozszerzanie i zwijanie - zmieniam zawartość. Na przykład chciałbym ustawić Orientacja StackPanel i TextMlock właściwości TextWrapping i FontSize. Nie sprecyzowałem tego, ponieważ chciałem, aby pytanie było proste. –

+0

Wystarczająco fair :-) Powinieneś być w stanie powiązać z {binding elementname = mytoggle, propertyname = checked} lub nawet użyć wyzwalacza na przełączniku, aby ustawić styl celów. –

8

Użyj BooleanToVisibilityConverter:

<BooleanToVisibilityConverter x:Key="bvc" /> 
<TextBlock Visibility="{Binding IsChecked, ElementName=toggle, Converter={StaticResource bvc}}" /> 
Powiązane problemy