Reputation: 247
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
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