coolercargo
coolercargo

Reputation: 247

XAML using radio buttons to enable and disable textbox with databinding

I am trying to figure out how to enable and disable textboxes with radio buttons and data binding. It seems like I should be able to bind the textbox IsEnabled to a boolean and modify that value but I can't quite get it to work. I want to have several sets of radio buttons and textboxes so I want a generic way to handle the problem. I tried to use a converter but since I am not using any x:Names I am not sure those would be helpful in this case. I can get them to enable/disable the radio buttons but that is not what I want to do. My code shows mostly the solution I am trying for the first textbox.

Xaml Code

    <Grid>
    <StackPanel>
        <RadioButton GroupName="grp1" Content="Enable TextBox"  IsEnabled="{Binding Bttn1, Mode=TwoWay}" IsChecked="{Binding Bttn1}" Checked="RadioButton_Checked" Unchecked="RadioButton_UnChecked" />
        <RadioButton GroupName="grp1" Content="Disable TextBox" IsEnabled="{Binding Bttn2}" />
        <TextBox IsEnabled="{Binding Txtbx1, Mode=TwoWay}" BindingGroup="{Binding grp1}" ></TextBox>

        <RadioButton GroupName="grp2" Content="Enable TextBox"  IsEnabled="{Binding Bttn3, Mode=TwoWay}" IsChecked="{Binding Bttn3}" Checked="RadioButton_Checked" Unchecked="RadioButton_UnChecked" />
        <RadioButton GroupName="grp2" Content="Disable TextBox" IsEnabled="{Binding Bttn4}" />
        <TextBox IsEnabled="{Binding Txtbx2, Mode=TwoWay}" BindingGroup="{Binding grp2}" ></TextBox>
    </StackPanel>
</Grid>

ViewModel Code

    private bool _bttn1;
    private bool _bttn2;
    private bool _bttn3;
    private bool _bttn4;
    private bool _txtbx1;
    private bool _txtbx2;

    public bool Bttn1
    {
        get
        {
            return(_bttn1);
        }

        set
        {
            _bttn1 = value;
            _txtbx1 = false;
            RaisePropertyChanged(Txtbx1.ToString());
        }

    }

    public bool Bttn2
    {
        get
        {
            return (_bttn1);
        }

        set
        {
            _bttn1 = value;
            _txtbx1 = false;
            RaisePropertyChanged(Txtbx1.ToString());
        }

    }

    public bool Txtbx1
    {
        get
        {
            return (_txtbx1);
        }

        set
        {
            _txtbx1 = false;
        }
    }

Further down I have

    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string name)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    }


    private void RadioButton_Checked(object sender, RoutedEventArgs e)
    {
        Handle(sender as RadioButton);
    }

    private void RadioButton_UnChecked(object sender, RoutedEventArgs e)
    {
        Handle(sender as RadioButton);
    }


    void Handle(RadioButton radioButton)
    {
        bool flag = radioButton.IsChecked.Value;

        this.Title = "IsChecked = " + flag.ToString();

    }

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

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return !(bool)value ? parameter : null;
        }

    }

Upvotes: 3

Views: 5043

Answers (1)

Juan Pablo Garcia Coello
Juan Pablo Garcia Coello

Reputation: 3232

In case you want to enable and disable textboxes with radio buttons, this solution works:

 <Grid>
        <StackPanel>
            <RadioButton x:Name="RB1" GroupName="grp1" Content="Enable TextBox" />
            <RadioButton GroupName="grp1" Content="Disable TextBox"  />
            <TextBox IsEnabled="{Binding IsChecked, ElementName=RB1}" ></TextBox>

            <RadioButton x:Name="RB2" GroupName="grp2" Content="Enable TextBox"  />
            <RadioButton GroupName="grp2" Content="Disable TextBox"  />
            <TextBox IsEnabled="{Binding IsChecked, ElementName=RB2}"  ></TextBox>
        </StackPanel>

Upvotes: 13

Related Questions