2009-10-07 43 views
20

Tôi muốn sử dụng WPF ToggleButton để mở rộng và thu gọn một số điều khiển trong ứng dụng của mình. Làm thế nào tôi có thể sử dụng XAML để thực hiện điều này?Liên kết với trạng thái IsChecked của WPF ToggleButton

Tôi nghĩ rằng bằng cách nào đó tôi có thể liên kết thuộc tính Visibility của một số điều khiển với trạng thái của ToggleButton, nhưng tôi không biết cách thực hiện việc này.

Có lẽ tôi cần phải cung cấp ToggleButton một Name của mình, sau đó liên kết sử dụng ElementName? Sau đó, tôi sẽ cần một ValueConverter để chuyển đổi giữa một giá trị boolean và một Visibility, chính xác? Làm thế nào tôi có thể thực hiện một ValueConverter chung cho mục đích này?

+6

Bạn không cần phải: nó đã có trong khung công tác. Tìm BooleanToVisibilityConverter. – itowlson

Trả lời

39

Bạn cần phải ràng buộc Visibility thông qua bộ chuyển đổi:

<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> 

Trong Silverlight không có BooleanToVisibilityConverter nhưng nó rất dễ dàng để viết riêng của bạn với một số tính năng bổ sung :

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

    } 

} 

Bây giờ bạn c một chỉ định một chuyển đổi mà các bản đồ true để Collapsedfalse-Visible: "Làm thế nào tôi có thể làm cho một ValueConverter chung cho mục đích này"

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

Tôi tin rằng cũng nên có thể sử dụng trình kích hoạt theo cách tương tự, a la http://stackoverflow.com/questions/250840/how-do-you-bind-the-textwrapping-property-of-a-textbox- to-the-ischecked-value-of –

+0

hoạt động như nét duyên dáng..thank bạn martin –

0

Có lý do nào khiến bạn không chỉ sử dụng số Expander không? Nó dựa trên ToggleButton anyway.

+0

Tôi đang làm nhiều hơn là chỉ mở rộng và thu gọn - Tôi đang sắp xếp lại nội dung. Ví dụ tôi muốn thiết lập một định hướng của StackPanel và các thuộc tính TextWrapping và FontSize của TextBlock. Tôi không chỉ rõ điều này vì tôi muốn giữ câu hỏi đơn giản. –

+0

Đủ công bằng :-) Bạn sẽ có thể liên kết với {binding elementname = mytoggle, propertyname = checked} hoặc thậm chí sử dụng trình kích hoạt trên nút chuyển đổi để đặt kiểu mục tiêu. –

8

Sử dụng BooleanToVisibilityConverter:

<BooleanToVisibilityConverter x:Key="bvc" /> 
<TextBlock Visibility="{Binding IsChecked, ElementName=toggle, Converter={StaticResource bvc}}" /> 
Các vấn đề liên quan