绑定到 WPF ToggleButton 的 IsChecked 状态

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1534208/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-08 21:04:20  来源:igfitidea点击:

Binding to a WPF ToggleButton's IsChecked state

wpfxamlbindingtogglebutton

提问by M. Dudley

I would like to use a WPF ToggleButtonto expand and collapse some controls in my application. How can I use XAML to accomplish this?

我想使用 WPFToggleButton来展开和折叠我的应用程序中的一些控件。如何使用 XAML 来完成此操作?

I'm thinking that I could somehow bind the Visibilityattribute of some controls to the ToggleButton's IsCheckedstate, but I do not know how to do this.

我想我可以以某种方式将Visibility某些控件的属性绑定到ToggleButton'sIsChecked状态,但我不知道该怎么做。

Maybe I need to give my ToggleButtona Name, then bind using ElementName? Then I would need a ValueConverterfor converting between a boolean value and a Visibility, correct? How could I make a generic ValueConverterfor this purpose?

也许我需要给我的ToggleButtona Name,然后使用ElementName? 然后我需要ValueConverter在布尔值和可见性之间进行转换,对吗?我怎么能ValueConverter为此目的制作一个泛型?

回答by Martin Liversage

You need to bind the Visibilitythrough a converter:

您需要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>

In Silverlight there is no BooleanToVisibilityConverterbut it is easy to write your own with some added features:

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

  }

}

Now you can specify a converter that maps trueto Collapsedand falseto Visible:

现在,您可以指定映射转换器trueCollapsedfalseVisible

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

回答by itowlson

Use the BooleanToVisibilityConverter:

使用 BooleanToVisibilityConverter:

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

回答by Steven Robbins

Is there a reason why you aren't just using the Expander? It's based on the ToggleButton anyway.

你有什么理由不只是使用Expander吗?无论如何,它都是基于 ToggleButton 的。