【duanzilin】TabControl怎样绑定ObservableCollection<ViewModelBase>?
这是我用WPF做出的效果:
WPF TabControl的ItemsSource绑定的是ObservableCollection<ViewModelBase>, ViewModelBase是ViewModelA、ViewModelB的共同父类。
就像上次我在http://topic.csdn.net/u/20110810/08/a44cdde1-db9a-412b-97ab-ada72cf746af.html提到的那样,可以通过
- XML code
<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:
- XML code
<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的原则不改变的情况下,有没有解决办法?
[解决办法]
不是很明白楼主的需求,Silverlight支持ObservableCollection<ViewModelBase>绑定,试着绑定TabControl.DataContext。
另外,在Silverlight中,可以使用pathlistbox实现楼主需求。相关教程,请看:
http://www.silverlightchina.net/plus/search.php?kwtype=0&keyword=pathlistbox&searchtype=titlekeyword
[解决办法]
我去年的解决方法,应不是什么好方法,仅供参考
http://blog.csdn.net/sunpire/article/details/5799606
[解决办法]
你可以看看WPF中的默认的模板定义,再看看Silverlight默认的模板定义,Silverlight下TabControl跟WPF中的实现有很大不同,而且在Silverlight中模版绑定时是有问题的,如果绑定的对象类型不完全相同,就不能正确显示,你将数据源绑定到ObservableCollection<ViewModelBase>,但实际绑定类型是ViewModelBase的派生类;
建议你换个思路来实现,我当初遇到这个问题,是用一个ToogleButton来模拟TabControl的标签页,然后用一个ContentControl来显示选中的标签页,实现起来也不难