欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

windows phone:数据绑定

程序员文章站 2022-07-08 14:23:22
数据绑定是一个对象的一个属性与另外一个对象的一个属性之间的一条链接(link),因此在绑定的情况下当一个属性发生改变时,另一个属性也随之更新。绑定可以是双向的(bidirectio...
数据绑定是一个对象的一个属性与另外一个对象的一个属性之间的一条链接(link),因此在绑定的情况下当一个属性发生改变时,另一个属性也随之更新。绑定可以是双向的(bidirectional)。

从本质上说,数据绑定可能像你所期望的那样:由于注册了一个事件处理程序,使得一个属性从另外一个属性中获取更新,期间可能进行了一些数据转换。通常你可以完全通过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文件中多次使用相同的转换器,最好将它定义为资源,这样能共享唯一实例。