绑定到 WPF ToggleButton 的 IsChecked 状态

Posted

技术标签:

【中文标题】绑定到 WPF ToggleButton 的 IsChecked 状态【英文标题】:Binding to a WPF ToggleButton's IsChecked state 【发布时间】:2010-12-04 18:54:29 【问题描述】:

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

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

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

【问题讨论】:

"我怎样才能为此目的制作一个通用的 ValueConverter?"您不需要:它已经在框架中。寻找 BooleanToVisibilityConverter。 【参考方案1】:

您需要通过转换器绑定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 映射到CollapsedfalseVisible 的转换器:

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

【讨论】:

我相信也应该可以以类似的方式使用触发器,例如***.com/questions/250840/… 想想你能想到的第一个简单直观的框架。它可能不是 WPF。【参考方案2】:

使用 BooleanToVisibilityConverter:

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

【讨论】:

【参考方案3】:

您不只是使用Expander 有什么原因吗?无论如何,它都是基于 ToggleButton 的。

【讨论】:

我所做的不仅仅是扩展和折叠——我正在重新排列内容。例如,我想设置 StackPanel 的 Orientation 和 TextBlock 的 TextWrapping 和 FontSize 属性。我没有具体说明这一点,因为我想让问题保持简单。 很公平 :-) 您应该能够使用 binding elementname=mytoggle, propertyname=checked 进行绑定,甚至可以在切换上使用触发器来设置目标样式。

以上是关于绑定到 WPF ToggleButton 的 IsChecked 状态的主要内容,如果未能解决你的问题,请参考以下文章

wpf combobox样式不显示倒三角

如何正确地将 Popup 绑定到 ToggleButton?

WPF 基础控件之 ToggleButton 样式

twoWay 绑定在以 ObservableCollection 作为源的 ToggleButton 中不起作用

WPF RadioButton/ToggleButton 样式

WPF中 怎么禁用 Expander.Header中的ToggleButton 要源代码呀~~