2014-09-12 190 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