windows phone:数据绑定
从本质上说,数据绑定可能像你所期望的那样:由于注册了一个事件处理程序,使得一个属性从另外一个属性中获取更新,期间可能进行了一些数据转换。通常你可以完全通过xaml来定义数据绑定。
绑定源与目标
在典型的数据绑定中,一个对象的属性发生变化时,另一个对象的属性也随之自动更新。提供数据的对象被认为是数据绑定的源,接收数据的对象是绑定的目标。
通常给数据绑定源指定一个名字:
<Slider Name="slider" ... />
把目标属性作为一个属性元素并赋值给类型为Binding的对象:
<TextBlock ...>
<TextBlock.Text>
<Binding ElementName="slider" Path="Value" />
</TextBlock.Text>
</TextBlock>
使用ElementName属性指定源元素的名称,使用Path属性指定源属性的名称、有时候这种类型的绑定称为元素名称绑定。
为了使语法更加友好,Silverlight为Binding提供了一个标记扩展,上面代码可以如下表示:
<TextBlock Text="{Binding ElementName=slider,Path=Value}" ... />
注意这里,slider和Value名称的引号皆已经去掉。
Path能把多个名称组合在一起使用。例如,假设Slider没有名称,如果你知道该Slider是ContentPanel元素的Children集合的第一个子元素,你可以间接地引用Slider:
Text="{Binding ElementName=ContentPanel,Path=Children[0].Value}"
或者使用可视化更上一层的元素:
Text="{Binding ElementName=LayoutRoot,Path=Children[1].Children[0].Value}"
若你想要数据绑定是双向的,则可添加以下设置:
TextBlock Text="{Binding ElementName=slider,Path=Value,Mode=TwoWay}"
注:Mode属性为BindingMode枚举类型的成员,Mode属性的默认值是BindingMode.OneWay,另外还有BindingMode.TwoWay和BindingMode.OneTime(该成员表示源只传输一次数据到目标)
绑定转换器
当你拖动Slider时TextBlock显示的Slider值有时是整数,更多时候是双精度浮点数。若你只想显示整数,则需要使用Binding类的Converter属性。
Binding类Converter属性是IValueConverter类型,IValueConverter是一个接口,它包含两个方法:Converter和ConverBack。
Convert方法处理从源到目标的数据转换,而ConverterBack方法则处理双向绑定时另一个方向的转换。
下面是一个简单的转换器例子:
namespace PhoneApp5
{
public class TruncationConverter : IValueConverter
{//转换类
public object Convert(object value, Type targetType,object parameter, CultureInfo culture)
{
if (value is double) //value是从源传递到目标的对象
return Math.Round((double)value);
return value;
}
public object ConvertBack(object value, Type targetType,object parameter, CultureInfo culture)
{
return value;
//如果你的转换类从来不使用在双向绑定上,则return null即可
}
}
}
下面是转换器使用的两种方法:
1.把TruncationConverter类作为资源
<phone:PhoneApplicationPage.Resources>
<local:TruncationConverter x:Key="truncate" />
</phone:PhoneApplicationPage.Resources>
然后在Binding扩展标记中引用这个资源
<TextBlock Text="{Binding ElementName=slider,Path=Value,Converter{StaticResource truncate}}" ... />
2.直接使用www.2cto.com
<TextBlock ...>
<TextBlock.Text>
<Binding ElementName="slider" Path="Value">
<Binding.Converter>
<local:TruncationConverter />
</Binding.Converter>
</Binding>
</TextBlock.Text>
</TextBlock ...>
如果在一个xaml文件中多次使用相同的转换器,最好将它定义为资源,这样能共享唯一实例。
上一篇: javascript---(01)--js语法基础
下一篇: C++的多重继承与虚基类