wpf 模板选择器DataTemplateSelector及动态绑定使用教程

时间:2022-06-07 08:24:11

其实也说不上算是教程了,只是把本身学习的代码拿出来分享一下,同时便利以后遇到类似问题的时候翻一下。
MSDN里如是说:
凡是,如果有多个 DataTemplate 可用于同一类型的东西,并且您但愿按照每个数据东西的属性供给本身的逻辑来选择要应用的 DataTemplate,则应创建 DataTemplateSelector。请注意,如果具有差别类型的东西,则可以对 DataTemplate 设置 DataType 属性。如果您执行了此操纵,则无需创建 DataTemplateSelector。别的,如果东西类型不异但属性差别,也可以考虑使用 DataTrigger 或数据转换器。
通俗讲,就是按照差此外数据选择差此外模板。接下来,我用一个例子来讲述DataTemplateSelector和动态绑定的使用要领。
先看例子的UI:

wpf 模板选择器DataTemplateSelector及动态绑定使用教程


图一

wpf 模板选择器DataTemplateSelector及动态绑定使用教程


图二
一个Listbox三个button,listbox显示一个调集的数据,第一个button “change”点击后可以切换与listbox绑定的调集,第二个button给PersonCollection添加person实例,第三个button给AnimalCollection添加animal实例。
默认情况下listbox与PersonCollection绑定,措施启动后,点击Add person按钮会向PersonCollection添加一个person实例,listbox会显示该调集下数据,如果person类的gender属性为Female,则只显示name属性,并把边框改成蓝色。点击change后,listbox与AnimalCollection绑定,显示AnimalCollection数据,同样,Add animal添加animal实例,如果第二个属性不是4,则只显示animal的type属性,并改削边框为蓝色。
下面讲实现
第一步:建两个类,一个person,一个animal,这就是每个listbox item将来要显示的数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

 

//person类
    public class person : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        private string _name;
        public string name
        {
            get
            {
                return _name;
            }
            set
            {
                if (value != _name)
                {
                    _name = value;
                    prochanged("name");
                }
            }
        }
        private string _gender;
        public string gender
        {
            get
            {
                return _gender;
            }
            set
            {
                if (value != _gender)
                {
                    _gender = value;
                    prochanged("gender");
                }
            }
        }
        private void prochanged(string info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(thisnew PropertyChangedEventArgs(info));
            }
        }
    }