问题
Sliverlight provides radio button with GroupName to group radiobutton together with only one option from mutiple choice. It's like:
<RadioButton GroupName="Option" Content="Option 1"></RadioButton>
<RadioButton GroupName="Option" Content="Option 2"></RadioButton>
<RadioButton GroupName="Option" Content="Option 3"></RadioButton>
then in VM, I have only one property for this option,say it's MyChoice
public int MyChoice {get; set;}
then how to setup data binding for this case between UI and VM?
回答1:
Used a converter to convert bools to an int:
On Xaml, asssuming options map to 1,2,3 on your MyChoice property:
<RadioButton GroupName="Option" Content="Option 1"
IsChecked="{Binding Path=MyChoice, Converter={StaticResource RadioButtonToIntConverter},
ConverterParameter=1}"/>
<RadioButton GroupName="Option" Content="Option 2"
IsChecked="{Binding Path=MyChoice, Converter={StaticResource RadioButtonToIntConverter},
ConverterParameter=2}"/>
<RadioButton GroupName="Option" Content="Option 3"
IsChecked="{Binding Path=MyChoice, Converter={StaticResource RadioButtonToIntConverter},
ConverterParameter=3}"/>
In the converter, noting that I did not add any cast protection:
public class RadioButtonToIntConverter:IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var para = System.Convert.ToInt32(parameter);
var myChoice = System.Convert.ToInt32(value);
return para == myChoice;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
var para = System.Convert.ToInt32(parameter);
var isChecked = System.Convert.ToBoolean(value);
return isChecked ? para : Binding.DoNothing;
}
}
Also you'd better to implement INotifyPropertyChanged in you ViewModel.
回答2:
Hi you will have to create three properties of type bool and bind to IsChecked property of RadioButton
<StackPanel>
<RadioButton GroupName="Option" Content="Option 1" IsChecked="{Binding MyChoice1}"></RadioButton>
<RadioButton GroupName="Option" Content="Option 2" IsChecked="{Binding MyChoice2}"></RadioButton>
<RadioButton GroupName="Option" Content="Option 3" IsChecked="{Binding MyChoice3}"></RadioButton>
</StackPanel>
ViewModel
public class ViewModel:INotifyPropertyChanged
{
bool myChoice1;
public bool MyChoice1
{
get { return myChoice1; }
set {
myChoice1 = value;
Notify("MyChoice1");
}
}
bool myChoice2;
public bool MyChoice2
{
get { return myChoice2; }
set
{
myChoice2 = value;
Notify("MyChoice2");
}
}
bool myChoice3;
public bool MyChoice3
{
get { return myChoice3; }
set
{
myChoice3 = value;
Notify("MyChoice3");
}
}
public void Notify(string propName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
public event PropertyChangedEventHandler PropertyChanged;
}
来源:https://stackoverflow.com/questions/17998562/how-to-set-up-data-binding-for-group-radio-button-in-silverlight