2009-10-07 2 views
20

Я хотел бы использовать WPF ToggleButton, чтобы развернуть и свернуть некоторые элементы управления в моем приложении. Как я могу использовать XAML для этого?Связывание с состоянием WPF ToggleButton IsChecked

Я думаю, что я мог бы каким-то образом связать атрибут Visibility некоторых элементов управления с состоянием, но я не знаю, как это сделать.

Возможно, мне нужно указать ToggleButton a Name, а затем связать с помощью ElementName? Тогда мне понадобится ValueConverter для преобразования между булевым значением и видимостью, правильно? Как я могу сделать общий ValueConverter для этой цели?

+6

Вам не нужно: это уже в рамках. Найдите BooleanToVisibilityConverter. – itowlson

ответ

39

Вам нужно связать Visibility через преобразователь:

<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 нет BooleanToVisibilityConverter но легко написать свой собственный с некоторыми дополнительными функциями :

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

    } 

} 

Теперь вы c указать конвертер, который отображает true к Collapsed и false к Visible: «Как я мог сделать общий ValueConverter для этой цели»

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

Я считаю, что также можно использовать триггеры аналогичным образом, а http://stackoverflow.com/questions/250840/how-do-you-bind-the-textwrapping-property-of-a-textbox- to-thechecked-value - –

+0

, который работал как шарм. –

0

Есть ли причина, по которой вы не просто используете Expander? В любом случае, это зависит от ToggleButton.

+0

Я делаю больше, чем просто расширяюсь и рушится - я перестраиваю контент. Например, я хотел бы установить ориентацию StackPanel и свойства TextWrapping и FontSize TextBlock. Я не указал этого, так как я хотел задать вопрос простым. –

+0

Достаточно справедливо :-) Вы должны иметь возможность связываться с {binding elementname = mytoggle, propertyname = checked} или даже использовать триггер на переключателе для установки стиля целей. –

8

Используйте BooleanToVisibilityConverter:

<BooleanToVisibilityConverter x:Key="bvc" /> 
<TextBlock Visibility="{Binding IsChecked, ElementName=toggle, Converter={StaticResource bvc}}" /> 
Смежные вопросы