读书人

【duanzilin】TabControl怎的绑定Obse

发布时间: 2012-08-13 13:21:53 作者: rapoo

【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来显示选中的标签页,实现起来也不难

读书人网 >CAD教程

热点推荐