如何在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
,它在其他平台上工作)
首先必须创建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属性的原因。否则,您应该像往常一样实现"经典"NotifyChanging
和NotifyChanged
事件。
这里唯一的区别是,如果将值设置为-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;
}
}