WPF 数据绑定[4]

对于集合类继承的ObservableCollection<>,这个类实际上是继承了InotifyPropertyChanged接口,同时也实现了InotifyCollectionChanged接口,所以这样才能保证所使用的ObjectForBinding类能够在不继承InotifyPropertyChanged的前提下征程使用。

 

第一部分:

A、现在,要为ObjectForBinding添加新的属性,代码如下:

 

B、Xaml的代码如下:

 

C、cs窗体加载的时候,为集合添加内容

 

到目前为止,和绑定单一属性的代码过程大体一致,运行后显示如下:

 

由于还没有指明显示的具体属性,所以会将该属性所属的对象的完整类名。

 

第二部分:

于是,如果要指明显示某一个属性,需要在绑定的控件上指明显示的属性,代码如下

不仅仅是ListBox,诸如ListView、TreeView都可以通过设置DisplayMamberPath属性的方式,指明控件显示的内容。

 

第三部分:

尽管在上一个部分,可以自由的选择显示不同的属性,但是仍然没有解决同时显示多个属性的问题,对于所有可以绑定集合的控件而言,其必然是具有类似Items的集合,一边和集合数据源做一一对应,所以我们要在第一部分的XAML的基础上再次做代码修改,代码如下:

其实就是使用控件的Item模板中的数据模板对于每一项Item的内容进行定义,需要注意的是,对于模板来说,其只能包含一个子集,也就是说DataTemplate不能够直接包含两个Label,所以需要使用一个容器控件StackPanel

 

另外,对于这类可显示多行数据的控件【ListBox、ListView等】,不能单独使用XXXItem的Content属性,一定要使用ItemsSource进行数据源的绑定设置。

 

第四部分:

如果使用过Asp.net的FormView的话,就会了解,对于各容器进行数据源绑定,然后在该容器下进行细节属性绑定是一件很惬意的事情,而再WPF中也是按这个思路进行的,于是第三部分的代码,可以修改成如下:

在这段代码中,使用了容器控件的DataContext属性,所以对于ListBox和Label控件而言,其就是可以在这个容器控件中随意指定显示相关数据源的数据。

 

另外,在以上这段代码中,Lable绑定的是集合类ObjectForBinding2的属性Count,如果绑定的是ObjectForBinding的属性的话,将不显示任何东西,因为Label没有办法知道要绑定集合类中那个子对象的相关属性,即便是集合中只存在一个子对象也是如此。

 

如果,想让Label显示子对象的属性的话,也就是要告诉Label显示哪个子对象的属性,所以需要在ListBox控件中添加IsSynchronizedWithCurrentItem。

 

这个属性的解释:获取或设置指示 Selector 是否应当使 SelectedItemItems 属性中的当前项保持同步的值。这是一个依赖项属性。

 

其功用是:

1、某个集合控件将这个属性设置成True的时候,和这个控件使用同一个数据源对象【objBind】的非集合控件【Label等】的属性将在集合控件选择改变的时候,作相应改变。

2、如果Label和ListBox不使用同一个数据源对象的话,则Label不受影响。

3、对于另一个集合控件【ListBox2】而言,除非也设置的这个属性,否则,即使和ListBox使用同一个数据源对象也不受其影响,换言之,只要使用同一个数据源对象,随便一个集合控件设置IsSynchronizedWithCurrentItem为True的话,功用1即可生效。

 

所以,只要将ListBox的属性IsSynchronizedWithCurrentItem设置为True即可。

 

至此,对于数据的基本绑定就总结完毕,下一节将对多对象多属性以及Binding对象进行总结。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值