绑定到 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
属性绑定到ToggleButton
的IsChecked
状态,但我不知道该怎么做。
也许我需要给我的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
映射到Collapsed
和false
到Visible
的转换器:
<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 状态的主要内容,如果未能解决你的问题,请参考以下文章
如何正确地将 Popup 绑定到 ToggleButton?
twoWay 绑定在以 ObservableCollection 作为源的 ToggleButton 中不起作用