RadioButtons绑定在Windows Phone 8.1上

时间:2015-06-10 11:25:25

标签: c# xaml mvvm radio-button windows-phone-8.1

我在绑定RadioButton属性IsChecked时遇到了一些问题。我在网格上有两个RadioButtonVisibility绑定到我的viewmodel上的属性。我想要实现的是当网格变得可见时,始终将第一个RadioButton设置为Checked状态。 这是一些代码:

<Grid Visibility="{Binding State, Converter={StaticResource VisibilityConverter}}">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>


                <RadioButton Grid.Row="0"
                             Margin="20,0" 
                             IsChecked="{Binding State, Converter={StaticResource StateToBooleanConverter}}"
                             Content="content 1" />

                <RadioButton Grid.Row="1"
                             Margin="20,0"
                             Content="content 2" />


            </Grid>

按照我的逻辑,当网格变为可见时,属性RadioButton进入特定状态时,应首先将State设置为已检查。它的工作正常,直到我达到第二RadioButton。然后我的绑定无法正常工作,当State发生变化时,StateToBooleanConverter中没有任何变化。 我阅读了很多关于在radiobuttons中绑定问题的信息,但在我的案例中没有任何效果。 是否可以在没有新属性的情况下检查radioButton?如果我能解决这个问题,我将不胜感激。

编辑:

viewmodel和Converter for IsChecked中有一些代码:

public class MainViewModel : ViewModel
{
    public MainViewModel
    {
        this.ChangeState = new RelayCommand(this.ChangeStateExecute);
    }

    public PageState State
    {
        get
        {
            return this.state;
        }
        set
        {
            if (this.state != value)
            {
                this.state = value;
                base.RaisePropertyChanged();
            }
        }
    }

    public RelayCommand ChangeState { get; private set; }

    private void ChangeStateExecute()
    {
        this.State = PageState.RadioButtonsVisible;
    }
}

public class StateToBooleanConverter : Converter
{
    protected override object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var state = (PageState)value;
        var result = state == PageState.RadioButtonsVisible;
        return result;
    }
}

1 个答案:

答案 0 :(得分:2)

假设PageState是枚举,this answer is what you're looking for.

要组合在一起的所有单选按钮都绑定到ViewModel的相同属性,并且所有单元都使用相同的ValueConverter。触发单选按钮检查/取消选中的值将传递到ValueConverter的parameter属性中。

针对您的具体问题,EnumBooleanConverter可以直接复制粘贴到您的代码中(请务必仔细阅读并确保您理解它。)

然后XAML变为

<Grid Visibility="{Binding State, Converter={StaticResource VisibilityConverter}}">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>


            <RadioButton Grid.Row="0"
                         Margin="20,0" 
                         IsChecked="{Binding State, Converter={StaticResource EnumBooleanConverter}, ConverterParameter=RadioButtonVisible}"
                         Content="content 1" />

            <RadioButton Grid.Row="1"
                         Margin="20,0"
                         IsChecked="{Binding State, Converter={StaticResource EnumBooleanConverter}, ConverterParameter=*Insert enum value here*}"
                         Content="content 2" />


        </Grid>