如何在windows phone 8中使用单选按钮的数据绑定

本文关键字:单选按钮 数据绑定 windows phone | 更新日期: 2023-09-27 18:21:07

如何在windows phone 8中使用单选按钮的数据绑定?

我的单选按钮

<RadioButton Content="5" GroupName="Radius" IsChecked="true" />
<RadioButton Content="10" GroupName="Radius" IsChecked="true" />
<RadioButton Content="20" GroupName="Radius" IsChecked="true" />
<RadioButton Content="50" GroupName="Radius" IsChecked="true" />
<RadioButton Content="All" GroupName="Radius" IsChecked="true" />

(如果你注意到我自己在回答这个问题,你是对的。我很难找到有效的解决方案。问题是,windows phone上缺少一些功能。例如Binding.DoNothing,它在其他平台上工作)

如何在windows phone 8中使用单选按钮的数据绑定

首先必须创建DataContext并将其绑定到PhoneApplicationPage。看起来像这个

DataContext="{Binding Search, Source={StaticResource Locator}}"

这是通常的绑定,有很多好的教程,所以我不会在这里解释。

然后在DataContext中,创建反映单选按钮的属性。

    private int _radiusRadio;
    public int RadiusRadio
    {
        get
        {
            return _radiusRadio;
        }
        set
        {
            if (value != -1)
            {
                if (Set(() => RadiusRadio, ref _radiusRadio, value))
                {
                    IsDirty = true;
                }
            }
        }
    }

在_radiusRadio中存储所选的值。我使用的是框架MVVM light,我也推荐它,这就是我在那里设置IsDirty属性的原因。否则,您应该像往常一样实现"经典"NotifyChangingNotifyChanged事件。

这里唯一的区别是,如果将值设置为-1,则什么也不做。这是因为windows phone在选择单选按钮时出现了奇怪的行为。当你第一次运行应用程序并使用单选按钮访问页面时,它可以在没有它的情况下工作。但当您离开该页面并返回时,它会开始发送您意想不到的值。

现在我们已经准备好创建我们的转换器了。转换器也是windos手机中数据绑定的典型工具。

这是转换器的代码(你可以复制和粘贴它,它对任何一组单选按钮都是一样的)

public class RadioButtonConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null || parameter == null)
        {
            return false;
        }
        int index = (int)value;
        int parIndex = Int32.Parse((string)parameter);
        return index == parIndex;
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (parameter == null || (bool)value == false)
        {
            return -1;
        }
        return Int32.Parse((string)parameter);   
    }
}

要添加转换器,您必须添加此

xmlns:converters="clr-namespace:MyGreatApp.Converters"PhoneApplicationPage

然后定义具体的转换器

<phone:PhoneApplicationPage.Resources>
        <converters:RadioButtonConverter x:Key="Radius" />
</phone:PhoneApplicationPage.Resources>

现在您可以使用数据绑定>

<RadioButton Content="5" GroupName="Radius" IsChecked="{Binding RadiusRadio, Converter={StaticResource Radius}, ConverterParameter=1, Mode=TwoWay}" />
<RadioButton Content="10" GroupName="Radius" IsChecked="{Binding RadiusRadio, Converter={StaticResource Radius}, ConverterParameter=2, Mode=TwoWay}"  />
<RadioButton Content="20" GroupName="Radius"  IsChecked="{Binding RadiusRadio, Converter={StaticResource Radius}, ConverterParameter=3, Mode=TwoWay}" />
<RadioButton Content="50" GroupName="Radius"  IsChecked="{Binding RadiusRadio, Converter={StaticResource Radius}, ConverterParameter=4, Mode=TwoWay}" />
<RadioButton Content="All" GroupName="Radius"  IsChecked="{Binding RadiusRadio, Converter={StaticResource Radius}, ConverterParameter=5, Mode=TwoWay}" />

正如您所看到的,convert参数定义了哪个单选按钮是哪个。当您选择一个时,它会存储在您的private int _radiusRadio;

在您的数据上下文中,您可以创建自己的"转换器",以获得您想要的值,而不是"1,2,3,4,5",例如看起来像这样(注意,这只是我使用的可选"最佳实践")>

    public int Radius
    {
        get
        {
            if (_radiusRadio == 1)
            {
                return 5;
            }
            if (_radiusRadio == 2)
            {
                return 10;
            }
            if (_radiusRadio == 3)
            {
                return 20;
            }
            if (_radiusRadio == 4)
            {
                return 50;
            }
            if (_radiusRadio == 5)
            {
                return 0;
            }
            return 0;
        }            
    }