【duanzilin】TabControl怎样绑定ObservableCollection

xhtmldivcss 2011-08-12 06:49:09
这是我用WPF做出的效果:


WPF TabControl的ItemsSource绑定的是ObservableCollection<ViewModelBase>, ViewModelBase是ViewModelA、ViewModelB的共同父类。

就像上次我在http://topic.csdn.net/u/20110810/08/a44cdde1-db9a-412b-97ab-ada72cf746af.html提到的那样,可以通过
<DataTemplate DataType="{x:Type vm:ViewModelA}">
<vw:ViewA />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:ViewModelB}">
<vw:ViewB />
</DataTemplate>

轻松搞定根据ViewModel类型显示对应的View. 这个View显示成TabItem的Content。

到了Silverlight,折腾了很久我才发现Silverlight的TabControl和WPF的好像很不一样。上面的这种语法不支持是一方面,然后用Prism的DataTemplateSelector:

<ItemsControl ItemsSource="{Binding Workspaces}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<prism:DataTemplateSelector Content="{Binding}">
<prism:DataTemplateSelector.Resources>
<DataTemplate x:Key="ViewModelA">
<vw:ViewA DataContext="{Binding}" />
</DataTemplate>
<DataTemplate x:Key="ViewModelB">
<vw:ViewB DataContext="{Binding}" />
</DataTemplate>
</prism:DataTemplateSelector.Resources>
</prism:DataTemplateSelector>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>

发现如果是ItemsControl, ListBox, ComboBox时都没问题,就是TabControl怎么弄都不行!

已经两天了,实在无力独立解决问题。在ObservableCollection<ViewModelBase>必须成为TabControl的ItemsSource的原则不改变的情况下,有没有解决办法?
...全文
247 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
沝林 2011-08-17
  • 打赏
  • 举报
回复
sunpire说的没错,Silverlight下TabControl没设计好,不适合用来绑定集合,用IEnumerable<TabItem>似乎是迫不得已的办法
沝林 2011-08-17
  • 打赏
  • 举报
回复
你可以看看WPF中的默认的模板定义,再看看Silverlight默认的模板定义,Silverlight下TabControl跟WPF中的实现有很大不同,而且在Silverlight中模版绑定时是有问题的,如果绑定的对象类型不完全相同,就不能正确显示,你将数据源绑定到ObservableCollection<ViewModelBase>,但实际绑定类型是ViewModelBase的派生类;

建议你换个思路来实现,我当初遇到这个问题,是用一个ToogleButton来模拟TabControl的标签页,然后用一个ContentControl来显示选中的标签页,实现起来也不难

xhtmldivcss 2011-08-17
  • 打赏
  • 举报
回复
确实如sunpire在博客中提到的那样“Silverlight的TabControl.ItemsSource 貌似要求为 IEnumerable<TabItem>”。就是一切麻烦的根源。

ItemsControl.ItemsSouce绑定ObservableCollection<ViewModelBase>,这一个是为了实现根据不同的ViewModel子类,显示不同的View的这么一个目的,另一个是就是实现所谓的Closable TabItem,也就是说在ObservableCollection<ViewModelBase>里remove一项时,ItemsControl会自动反应出变化。这些用WPF实现是一点问题都没有。

我也看到过用AttachedProperty解决这类问题的……

这个问题准备暂告一段落,找时间看看Prism的TabRegionAdapter在这方面能不能提供帮助。






Sunpire 2011-08-16
  • 打赏
  • 举报
回复
我去年的解决方法,应不是什么好方法,仅供参考

http://blog.csdn.net/sunpire/article/details/5799606
jv9 2011-08-16
  • 打赏
  • 举报
回复
不是很明白楼主的需求,Silverlight支持ObservableCollection<ViewModelBase>绑定,试着绑定TabControl.DataContext。

另外,在Silverlight中,可以使用pathlistbox实现楼主需求。相关教程,请看:

http://www.silverlightchina.net/plus/search.php?kwtype=0&keyword=pathlistbox&searchtype=titlekeyword
  • 打赏
  • 举报
回复
哦 这个版块没高手。。。

8,737

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧