首页 新闻 赞助 找找看

WPF 绑定List<string>的ListBox为什么会显示ListBoxItem集合

0
悬赏园豆:100 [已关闭问题] 关闭于 2015-06-08 14:59

绑定List<string>的ListBox为什么UI会显示ListBoxItem集合呢?

而绑定List<string>的ItemsControl,且ItemTemplate不设置的情况下却什么也不显示。ListBox在不设置ItemTemplate的情况下能用以“ListBoxItem”“包装”的方式显示类型集合,ItemsControl不设置“ItemTemplate”就不显示任何东西,这其中的原理是什么(或者ListBox类如何实现的这一逻辑)?

我用ILSpy没找到,希望大神解决,最好指明在.NET哪个类中的哪个方法实现的这一逻辑。越精确越好!

 

假如xaml UI中的一个ListBox叫“listbox1”:

this.listbox1.ItemsSource=new List<string>{"1","2","3","4","5"};

Debug->就可以看到“listbox1”中有内容,是五个“ListBoxItem”,这五个“ListBoxItem”里面才包装着{"1","2","3","4","5"},我想问这五个“ListBoxItem”是怎么创建的,它在.NET哪个类中的哪个方法实现的这一逻辑?

和ItemTemplate无关,ItemTemplate归根结底是应用到“ContentPersenter”的“ContentTemplate”属性上指导UI如何显示数据的。

yuan-zz的主页 yuan-zz | 初学一级 | 园豆:22
提问于:2015-05-29 17:01
< >
分享
所有回答(4)
0

  你ItemTemplate怎么绑的?  能贴贴code吗?

请叫我头头哥 | 园豆:9382 (大侠五级) | 2015-05-29 17:15

问题描述很简单,假如xaml UI中的一个ListBox叫“listbox1”:

this.listbox1.ItemsSource=new List<string>{"1","2","3","4","5"};

Debug->就可以看到“listbox1”中有内容,是五个“ListBoxItem”,这五个“ListBoxItem”里面才包装着{"1","2","3","4","5"},我想问这五个“ListBoxItem”是怎么创建的,它在.NET哪个类中的哪个方法实现的这一逻辑?

和ItemTemplate无关,ItemTemplate归根结底是应用到“ContentPersenter”的“ContentTemplate”属性上指导UI如何显示数据的。

支持(0) 反对(0) yuan-zz | 园豆:22 (初学一级) | 2015-05-29 17:24
0

 你这样是不行的,你将数据放到一个集合对象中,然后在XAML中绑定相应的对象属性在,最后设置ItemsSource等于这个集合对象就可以啦,不用你写的那么麻烦!

hippieZhou | 园豆:578 (小虾三级) | 2015-05-29 22:01
0

基本功还很薄弱啊兄弟

1,ListBox的DataSource绑定的数据源应该是object类型

2,所以 List<string>绑定是没问题的

3,ListBoxItem这个是控件的真实数据源类型

4,这时候会发生类型转换将你绑定的 List<string>转换成ListBoxItem

5,转换成功就是可以绑定的,否则会有错误提示。

茂茂 | 园豆:2892 (老鸟四级) | 2015-06-01 15:56

首先谢谢你的回答,我有以下几个问题:

1,ListBox的ItemsSource绑定的数据源应该是IEnumerable<object>类型

2,List<string>绑定肯定没问题

3,

4,

5,几乎都是可以绑定的,ListBox绑定时默认显示Object.Tostring()或类型完全限定名namespace.class

你确定你看懂问题了,还是答非所问了。

如你的3,4我是问这部分转换的代码在哪里?(WPF)

支持(0) 反对(0) yuan-zz | 园豆:22 (初学一级) | 2015-06-01 16:08

@我足以与你相配: 我也不知道转换代码在哪里,好好理解面向对象的语言。子类型转换成父类型的是时候我也想问下转换的代码在哪里呢?如果这样都需要转换的代码,我也不知道要继承干什么?

支持(0) 反对(0) 茂茂 | 园豆:2892 (老鸟四级) | 2015-06-01 16:49

@茂茂: 还是非常感谢,可以用ILSpy反编译找,不过代码太多了,不好找。

支持(0) 反对(0) yuan-zz | 园豆:22 (初学一级) | 2015-06-01 16:50
0

ListBox源码中有:

protected override DependencyObject GetContainerForItemOverride()
        {
            return new ListBoxItem();
        }

protected override bool IsItemItsOwnContainerOverride(object item)
        {
            return item is ListBoxItem;
        }

两个方法,这就是Why!!!!!!!!!!

yuan-zz | 园豆:22 (初学一级) | 2015-06-08 14:57

你好,我想请问下你这个源码是在哪找到的?

支持(0) 反对(0) 叛逆の亡灵 | 园豆:200 (初学一级) | 2017-04-24 20:19

@叛逆の亡灵: 用ILSpy反编译,.NET 也开源了。源码在WPF的ListBox类中

支持(0) 反对(0) yuan-zz | 园豆:22 (初学一级) | 2017-04-24 20:21

@Zhang_Yuan: 非常感谢!

支持(0) 反对(0) 叛逆の亡灵 | 园豆:200 (初学一级) | 2017-04-24 20:23

@叛逆の亡灵: 两年前的问题了,没想到还有人看呢,哈哈

支持(0) 反对(0) yuan-zz | 园豆:22 (初学一级) | 2017-04-24 20:24

@Zhang_Yuan: 刚好解决了我这块的问题,找了好久来着。

支持(0) 反对(0) 叛逆の亡灵 | 园豆:200 (初学一级) | 2017-04-24 20:25

@叛逆の亡灵: http://www.cnblogs.com/Mr--Zhang/p/5661121.html

支持(0) 反对(0) yuan-zz | 园豆:22 (初学一级) | 2017-04-24 20:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册