绑定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如何显示数据的。
你ItemTemplate怎么绑的? 能贴贴code吗?
问题描述很简单,假如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如何显示数据的。
你这样是不行的,你将数据放到一个集合对象中,然后在XAML中绑定相应的对象属性在,最后设置ItemsSource等于这个集合对象就可以啦,不用你写的那么麻烦!
基本功还很薄弱啊兄弟
1,ListBox的DataSource绑定的数据源应该是object类型
2,所以 List<string>绑定是没问题的
3,ListBoxItem这个是控件的真实数据源类型
4,这时候会发生类型转换将你绑定的 List<string>转换成ListBoxItem
5,转换成功就是可以绑定的,否则会有错误提示。
首先谢谢你的回答,我有以下几个问题:
1,ListBox的ItemsSource绑定的数据源应该是IEnumerable<object>类型
2,List<string>绑定肯定没问题
3,
4,
5,几乎都是可以绑定的,ListBox绑定时默认显示Object.Tostring()或类型完全限定名namespace.class
你确定你看懂问题了,还是答非所问了。
如你的3,4我是问这部分转换的代码在哪里?(WPF)
@我足以与你相配: 我也不知道转换代码在哪里,好好理解面向对象的语言。子类型转换成父类型的是时候我也想问下转换的代码在哪里呢?如果这样都需要转换的代码,我也不知道要继承干什么?
@茂茂: 还是非常感谢,可以用ILSpy反编译找,不过代码太多了,不好找。
ListBox源码中有:
protected override DependencyObject GetContainerForItemOverride()
{
return new ListBoxItem();
}
和
protected override bool IsItemItsOwnContainerOverride(object item)
{
return item is ListBoxItem;
}
两个方法,这就是Why!!!!!!!!!!
你好,我想请问下你这个源码是在哪找到的?
@叛逆の亡灵: 用ILSpy反编译,.NET 也开源了。源码在WPF的ListBox类中
@Zhang_Yuan: 非常感谢!
@叛逆の亡灵: 两年前的问题了,没想到还有人看呢,哈哈
@Zhang_Yuan: 刚好解决了我这块的问题,找了好久来着。
@叛逆の亡灵: http://www.cnblogs.com/Mr--Zhang/p/5661121.html