微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

silverlight 学习笔记 三: silverlight中的数据绑定

在前面的笔记中讲过了在silverlight中作为UI层只负责界面的展示,而与viewmodel的联系是通过绑定方式,其绑定可以是数据的绑定也可以是事件的绑定。那么我们需要了解下究竟在UI中绑定的实现。

一、绑定语法

绑定可以在设计时绑定也可以在后台绑定,通常我们在设计时进行绑定,数据绑定语法是: 属性=“{Binding 类属性,Mode=绑定方式}”,如下:

<TextBox name="txUserid" Height="21"  textwrapping="Wrap"  DataContext="{Binding Source={StaticResource UserDataSource}}" Text="{Binding UserInfo.UserID,Mode=OneWay}"/>

当然在silverlight中除了与实体类属性绑定外还支持元素间属性的绑定,即一个控件的属性绑定另一个控件的属性如:<TextBlock Text="{Binding Text.Length,ElementName=txUserid}" />

二、绑定方式

在Silverlight ,支持OneTime、OneWay、TwoWay三种形式的数据绑定。

简单的说:
OneTime模式下:控件与数据绑定后,能自动显示数据,一旦显示完成后,这二者就没有任何关联了。(即自动解除绑定)
OneWay模式下:控件与数据绑定后,除自动显示数据外,显示完成后,控件与数据源仍有单向关联,即如果数据源以后发生了变化,控件上的值也会自动变化.
TwoWay模式下:控件与数据源的关联是双向的,即数据源的变化会影响控件上的值,反过来控件上的任何值变化也会影响数据源本身发生变化。
实际开发中,我们的数据源通常不会是某一个现成控件的属性,多半是xml/数据库等对应的实体类,这里要注意的是,如果控件与自定义类绑定, 自定义类必须实现INotifyPropertyChanged接口

在MVVM模式中由于View从viewmodel中提取数据所以viewmodel类必须从INotifyPropertyChanged接口继承而来,通常viewmodel中会定义一个或多个Model类的实体公布给View,所以Model类也将从INotifyPropertyChanged接口继承。这样才能保障数据源的变化与UI控件上值的变化进行及时更新。

需要提醒的是在silverlight中的UI的更新是在控件失去焦点后发生的。

三、事件绑定

在silverlight中除了能将UI控件中的属性进行数据绑定外,还可以将UI控件中的事件进行绑定。在MVVM模式中,viewmodel将会向View暴露所有Vew要用到的事件属性,而这些事件属性都将继承ICommand接口。其实现方式如下:

1、在viewmodel中公布事件属性

        public ICommand UpdateDataCommand
        {
            get;
            set;
        }

        public ICommand LoadDataCommand
        {
            get { 
                return new Common.DelegateCommand(LoadData);
            }
            
        }
       
2、事件初始化:事件初始化往往是在viewmodel构造函数中定义

 public User()
        {
            this.UpdateDataCommand = new Common.DelegateCommand(UpdateData);
        }
此处的Common.DelegateCommand类是实现了ICommand接口的类
3、定义事件处理函数

 public void LoadData(object param)
        {
            this.UserInfo = Model.User.LoadData();
        }
此处的事件处理方法中的参数类型为object类型,即可以接入所有类型的事件参数,在实际应用中我们往往需要传递某个类的实例作为事件处理函数的参数

4、在UI中定义事件绑定

<Button x:Name="button" Content="加载数据" HorizontalAlignment="Left" Margin="97,166,112" Width="83" Command="{Binding LoadDataCommand,Mode=OneWay}" DataContext="{Binding Source={StaticResource UserDataSource}}"/>
如上,可以将Button的command事件绑定到viewmodel中公布的事件属性LoadCommand上,另外一种事件绑定方式是利用行为模式进行绑定如下代码,其实现与上面一致。

    	<Button x:Name="button" Content="加载数据" HorizontalAlignment="Left" Margin="97,112" Width="83">
    		<i:Interaction.Triggers>
    			<i:EventTrigger EventName="Click">
    				<i:InvokeCommandAction Command="{Binding LoadDataCommand,Mode=OneWay}"/>
    			</i:EventTrigger>
    		</i:Interaction.Triggers>
    	</Button>
以上介绍了silverlight中基本的数据绑定方式,由此可以看出在silverlight中绑定是如此灵活和强大,这也为MVVM模式将UI设计与后台逻辑分离的实现变得更为简单了,如果一个好的MVVM应用模式将会在View中不用写一行后置代码就能实现所有应有的功能。下面精彩还将继续!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐