8

Sliverlight 提供带有 GroupName 的单选按钮,以将单选按钮与多选中的一个选项组合在一起。就像是:

<RadioButton GroupName="Option" Content="Option 1"></RadioButton>
<RadioButton GroupName="Option" Content="Option 2"></RadioButton>
<RadioButton GroupName="Option" Content="Option 3"></RadioButton>

然后在 VM 中,这个选项只有一个属性,比如 MyChoice

public int MyChoice {get; set;}

那么如何在 UI 和 VM 之间为这种情况设置数据绑定?

4

2 回答 2

14

使用转换器将 bool 转换为 int:

在 Xaml 上,假设选项映射到 MyChoice 属性上的 1、2、3:

    <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}"/>

在转换器中,请注意我没有添加任何强制转换保护:

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;
    }
}

此外,您最好在 ViewModel 中实现 INotifyPropertyChanged。

于 2013-08-01T15:55:41.397 回答
0

您好,您必须创建三个 bool 类型的属性并绑定到 RadioButton 的 IsChecked 属性

<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>

视图模型

        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;
    }
于 2013-08-01T15:52:46.993 回答