簡體   English   中英

WPF-雙向綁定

[英]WPF - Two way binding

我創建了包含名為ButtonState(選中,禁用或可用)屬性的用戶控件(切換按鈕)。 控件具有內置的鼠標單擊事件,可將其狀態從可用狀態轉換為按下狀態,或從按下狀態轉換為可用狀態(如果禁用,則無法單擊)。

我的目的是創建按鈕的“樹”,類似這樣:

OPTION 1                          OPTION 2
SUBOPTION1 SUBOPTION1             SUBOPTION1 SUBOPTION1
....                              .....

因此,如果我單擊按鈕“ OPTION 1”(在控件內將狀態更改為PRESSED),我想將按鈕“ OPTION 2”轉到狀態“已禁用”。 如果我再次單擊OPTION 1,它將從PRESSED轉換為AVAILABLE,而OPTION2變為AVAILABLE TOO。 如果我單擊OPTION2(當然類似),則應運行相同的過程。 再次簡短地介紹一下:只有一個按鈕可以處於PRESSED狀態,如果一個按鈕處於這種狀態,則必須禁用另一個按鈕。 如果一個可用,則另一個也必須可用。

我已經創建了轉換器(InverseButtonStateConverter)BUTTONSTATE-> BUTTONSTATE

public object Convert(object value, Type targetType, object parameter,       System.Globalization.CultureInfo culture)
{
switch (((Controls.ButtonState)value))
    {
            case Controls.ButtonState.Available: return Controls.ButtonState.Available;
            case Controls.ButtonState.Pressed: return Controls.ButtonState.Disable;
            case Controls.ButtonState.Disable: return Controls.ButtonState.Available;
            default: return Controls.ButtonState.Available;
    }
}

在XAML中使用:

        <Controls:ToggleRectangleButton HorizontalAlignment="Center" VerticalAlignment="Center" Height="109" Width="210" ButtonText2="Bilety jednorazowe" TextFontSize="25" Grid.Column="0" x:Name="btSingleTicket" Click="btSingleTicket_Click" ButtonState="{Binding ElementName=btTimeTicket, Path=ButtonState, Converter={StaticResource InverseButtonStateConverter}}"/>
        <Controls:ToggleRectangleButton HorizontalAlignment="Center" VerticalAlignment="Center" Height="109" Width="210" ButtonText2="Bilety czasowe" TextFontSize="25" Grid.Column="3" x:Name="btTimeTicket" Click="btTimeTicket_Click" ButtonState="{Binding ElementName=btSingleTicket, Path=ButtonState, Converter={StaticResource InverseButtonStateConverter}}"/>

當我運行此代碼時,單擊一個按鈕時效果很好。 如果我通過單擊第二個來打斷它(它將無法正常工作),則第一個正確工作的按鈕功能將消失。

我嘗試更改綁定模式,但不知道如何制作。 一些幫助?

使用兩個ToggleButton和一個布爾型逆變器轉換器,可以通過將它們各自的IsEnabled屬性綁定到IsChecked屬性來實現它:

<ToggleButton Content="1" x:Name="btn1" IsEnabled="{Binding ElementName=btn2, Path=IsChecked, Converter={StaticResource BooleanInverterConverter}}"/>
<ToggleButton Content="2" x:Name="btn2" IsEnabled="{Binding ElementName=btn1, Path=IsChecked, Converter={StaticResource BooleanInverterConverter}}"/>

還有ValueConverter (簡單實現):

public class BooleanInverterConverter : IValueConverter 
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    {
        return !(bool) value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    {
        throw new NotImplementedException();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM