WPF - 双向绑定

时间:2014-09-12 11:15:51

标签: c# wpf xaml binding

我创建了用户控件(切换按钮),其中包含名为ButtonState(已选中,已禁用或可用)的属性。 Control具有内置鼠标单击事件,可将其状态从可用状态转换为按下状态或从按下状态转换为可用状态(如果禁用则无法单击)。

我的目的是创建按钮的“树”,类似的东西:

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

因此,如果我点击按钮“OPTION 1”(它在控件内将状态更改为PRESSED)我想按“OPTION 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}}"/>

当我运行此代码时,单击一个按钮时效果很好。如果我通过点击第二个来打断它(它不会像我想的那样工作),第一个按钮的正确工作能力就会消失。

我试图更改绑定模式,但我不知道如何制作它。一些帮助?

1 个答案:

答案 0 :(得分:4)

使用两个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();
    }
}