8

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?

Tyler Morrow
  • 949
  • 8
  • 31
KentZhou
  • 24,805
  • 41
  • 134
  • 200

2 Answers2

14

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.

Bill Zhang
  • 1,909
  • 13
  • 10
0

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;
    }
yo chauhan
  • 12,079
  • 4
  • 39
  • 58