多语言展示
当前在线:1968今日阅读:168今日分享:49

WPF之DataTemplateSelector技巧

WPF中如何通过一个属性来控制对象的模板,属性值改变时对象的模板会跟随改变?
两个关键点
2

模板选择器(DataTemplateSelector)根据不同的属性值,调用不同的模板。

方法一:使用属性触发
1

定义一个继承INotifyPropertyChanged接口的类(MyItem)类中包含Type属性,该属性更改时,发送属性更改的通知。

2

模板选择器(MyDataSelector)根据不同的Type属性,返回不同的模板。

3

使用ListBox测试,ListBox根据不同Type值,显示不同的模板。ListBox的资源中定义了3个模板,使用ContentPresenter做为ListBox的数据模板,并为MyDataSelector中的模板指定资源。ContentPresenter的内容绑定的Type值,获得到Type值得更改消息后,便会选用适当的模板,以实现根据属性控制对象的模板。

4

测试方法使用ComboBox来切换ListBox中的Type值,从而ListBoxItem显示不同的模板。

5

初始化编写初始化代码,使用List集合作为数据源。

6

查看效果

方法二:使用ObservableCollection集合
1

与方法一区别,这里使用普通的类,无需继承INotifyPropertyChanged接口public class MyItem2 {    public string Type { get; set; }}

2

这里使用ListBox的ItemTemplateSelector属性,直接使用模板选择器。模板选择器代码也需做相应的更改,SelectTemplate方法的item参数此事为MyItem2对象,而非方法一中的MyItem.Type属性。

3

如使用方法一中的测试方法,发现ListBox数据中的具体Type值更改了,但是模板未更改。因为此法并不更加Type属性触发消息,需根据数据集ListSource中子项更改来触发。实现方法:ComBox中的选项更改后,触发消息更改ListSource中的指定子项。Combox的SelectedValue绑定增加NotifyOnSourceUpdated=True设置,并添加SourceUpdated事件(cmb_SourceUpdated方法实现更新指定子项)。SelectedValue='{Binding ElementName=lst,Path=SelectedItem.Type,NotifyOnSourceUpdated=True}'                  SourceUpdated='cmb_SourceUpdated'

4

最后的效果与方法一相同,这里不再介绍。

源码下载
1

down.51cto.com/data/1875309

2

download.csdn.net/download/lk/7952045END

注意事项
1

如果想继续学习本人经验,请关注。

2

如果觉得经验值得学习,请分享。

推荐信息