Связывание с состоянием IsChecked WPF ToggleButton - PullRequest
23 голосов
/ 08 октября 2009

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

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

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

Ответы [ 3 ]

43 голосов
/ 08 октября 2009

Вам необходимо связать 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; }

  }

}

Теперь вы можете указать конвертер, который сопоставляет true с Collapsed и false с Visible:

<BooleanToVisibilityConverter
  x:Key="InverseBooleanToVisibilityConverter" InvertVisibility="True"/>
8 голосов
/ 08 октября 2009

Использовать BooleanToVisibilityConverter:

<BooleanToVisibilityConverter x:Key="bvc" />
<TextBlock Visibility="{Binding IsChecked, ElementName=toggle, Converter={StaticResource bvc}}" />
0 голосов
/ 08 октября 2009

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

...