2009-10-07 21 views
20

Ich möchte ein WPF ToggleButton verwenden, um einige Steuerelemente in meiner Anwendung zu erweitern und zu reduzieren. Wie kann ich XAML verwenden, um dies zu erreichen?Bindung an einen WPF-ToggleButton IsChecked-Status

Ich denke, dass ich irgendwie das Visibility Attribut einiger Kontrollen an die ToggleButtonIsChecked Zustand binden könnte, aber ich weiß nicht, wie man das macht.

Vielleicht muss ich meine ToggleButton eine Name geben, dann binden mit ElementName? Dann würde ich eine ValueConverter für die Konvertierung zwischen einem booleschen Wert und einer Sichtbarkeit benötigen, richtig? Wie könnte ich einen generischen ValueConverter für diesen Zweck machen?

+6

Das müssen Sie nicht: Es ist bereits im Framework. Suchen Sie nach BooleanToVisibilityConverter. – itowlson

Antwort

39

Sie müssen die Visibility durch einen Konverter binden:

<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 gibt es keine BooleanToVisibilityConverter aber es ist einfach, Ihre eigenen mit einigen zusätzlichen Features zu schreiben :

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

    } 

} 

Jetzt sind Sie c ein einen Konverter an, die Karten true zu Collapsed und false-Visible: „Wie könnte ich eine generische Valueconverter für diesen Zweck machen“

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

Ich glaube, dass es auch möglich sein sollte, Trigger in ähnlicher Weise zu verwenden, a la http://stackoverflow.com/questions/250840/how-do-you-bind-the-textwrapping-property-of-a-textbox- zum-ischecked-Wert-von –

+0

das funktionierte wie Charme..thank Sie Martin –

0

Gibt es einen Grund, warum Sie nicht nur die Expander verwenden? Es basiert auf dem ToggleButton.

+0

Ich mache mehr, als nur zu expandieren und zu kollabieren - ich arrangiere Inhalte neu. Ich möchte zum Beispiel die Ausrichtung eines StackPanels und die TextWrapping- und FontSize-Eigenschaften eines TextBlocks festlegen. Ich habe das nicht angegeben, weil ich die Frage einfach halten wollte. –

+0

Schön genug :-) Sie sollten in der Lage sein, mit {binding elementname = mytoggle, propertyname = checked} zu binden oder sogar einen Trigger beim Umschalten zu verwenden, um den Zielstil zu setzen. –

8

Verwenden Sie die BooleanToVisibilityConverter:

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