2009-10-07 64 views
20

我想使用WPF ToggleButton展開和摺疊我的應用程序中的一些控件。我如何使用XAML來完成這個任務?綁定到WPF ToggleButton的IsChecked狀態

我在想,我可以以某種方式將某些控件的Visibility屬性綁定到ToggleButtonIsChecked狀態,但我不知道該怎麼做。

也許我需要給我的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一個指定映射trueCollapsedfalseVisible轉換器:「我怎麼能做出一個通用ValueConverter爲此,」

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

我相信應該也可以以類似的方式使用觸發器,例如http://stackoverflow.com/questions/250840/how-do-you-bind-the-textwrapping-property-of-a-textbox-缺乏價值的 –

+0

像魅力一樣工作..謝謝你馬丁 –

0

是不是有一個原因,你不只是使用Expander?無論如何,它基於ToggleButton。

+0

我做的不僅僅是擴展和崩潰 - 我正在重新整理內容。例如,我想設置一個StackPanel的方向和一個TextBlock的TextWrapping和FontSize屬性。我沒有指定這個,因爲我想保持簡單的問題。 –

+0

足夠公平:-)您應該可以使用{binding elementname = mytoggle,propertyname = checked}進行綁定,或者甚至在切換上使用觸發器來設置目標樣式。 –

8

使用BooleanToVisibilityConverter:

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