对于集合类继承的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 是否应当使 SelectedItem 与 Items 属性中的当前项保持同步的值。这是一个依赖项属性。
其功用是:
1、某个集合控件将这个属性设置成True的时候,和这个控件使用同一个数据源对象【objBind】的非集合控件【Label等】的属性将在集合控件选择改变的时候,作相应改变。
2、如果Label和ListBox不使用同一个数据源对象的话,则Label不受影响。
3、对于另一个集合控件【ListBox2】而言,除非也设置的这个属性,否则,即使和ListBox使用同一个数据源对象也不受其影响,换言之,只要使用同一个数据源对象,随便一个集合控件设置IsSynchronizedWithCurrentItem为True的话,功用1即可生效。
所以,只要将ListBox的属性IsSynchronizedWithCurrentItem设置为True即可。
至此,对于数据的基本绑定就总结完毕,下一节将对多对象多属性以及Binding对象进行总结。