2014-09-12 232 views
0

我創建了包含名爲ButtonState(Checked,Disabled或Available)的屬性的用戶控件(切換按鈕)。 Control具有內置的鼠標點擊事件,它將狀態從可用狀態轉換爲可用狀態,或者從按下狀態轉換爲可用狀態(如果禁用則不能點擊)。WPF - 雙向綁定

我的目的是創建按鈕的「樹」,這樣的事情:

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

所以,如果我點擊按鈕「選項1」(它改變狀態控制範圍之內按下)我想按鈕「選項2「進入狀態DISABLED。如果我再次點擊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}}"/> 

當我運行這段代碼,當我點擊一個按鈕,它的工作好。如果我通過點擊第二個按鈕來打斷它(它不會按我的意願工作),首先按鈕能夠糾正工作消失。

我試圖改變綁定模式,但我不知道如何做到這一點。一些幫助?

+0

使用ViewModel的效果更好 – 2014-09-12 15:18:31

回答

4

使用兩個ToggleButton S,和一個布爾逆變器轉換器,你可以通過它們各自的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(); 
    } 
} 
+0

效果很好,謝謝;) – Lukas 2014-09-15 08:43:47