我正在尝试实现一个选项卡控件,其中每个项都来自我的视图模型的ICollectionView。对于来自ICollectionView的项,每个选项卡页都是相同的。不过,我希望有一个额外的选项卡页的配置选项。
因此,选项卡标题“屏幕快照”的示例可能是:
tabA | tabB | tabC | config在另一个例子中,它可能是
tabA | config或
config我可以使用ItemTemplateSelectors定义每个项的标题,使用ContentTemplateSelectors定义内容。所以那部分应该没问题。
我在添加配置页面项时遇到了问题,因为我不知道在哪里添加它。我想我可以将选项卡的ItemsSource设置为CompositeCollection,其中最后一项是配置页面对象。我未能做到这一点。
在下面的示例中,我可以根据我设置的designer示例数据查看正在正确填充的选项卡标题--我还没有添加配置页面。
<controls:MetroTabControl ItemsSource="{Binding View}">
<controls:MetroTabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Value.siteDisplayName}" />
</DataTemplate>
</controls:MetroTabControl.ItemTemplate>
<controls:MetroTabControl.ContentTemplate>
<DataTemplate>
<TextBlock Text="{Binding Value.siteComment}"/>
</DataTemplate>
</controls:MetroTabControl.ContentTemplate>
</controls:MetroTabControl>如您所见,我已经将ItemsSource设置为{Binding }。这个“视图”来自我的ViewModel,是一个ICollectionView。
理想情况下,我可以做一些魔法,比如:
<controls:MetroTabControl>
<controls:MetroTabControl.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{Binding View}"/>
<SomeConfigPageObject/>
</CompositeCollection>
</controls:MetroTabControl.ItemsSource>
...snip...
</controls:MetroTabControl>但问题是,当我这样做时,控件的设计器预览就好像ItemsSource中没有项目一样。
作为参考,{Binding }中的每一项都是包含值属性的对象,包含包含siteDisplayName和siteComment的对象的Value属性。
作为参考,选项卡的DataContext被定义为包含它的dockpanel,如下所示。
<DockPanel DataContext="{Binding Source={StaticResource Configurator}}"
d:DataContext="{d:DesignInstance cfuid:ConfigSiteVMSampleData, IsDesignTimeCreatable=true}"
LastChildFill="True">作为参考,Configurator是我的视图模型,在xaml中实例化为:
<UserControl.Resources>
<ResourceDictionary>
...snip...
<cfvmc:ConfigSiteVM x:Key="Configurator" />
...snip...因此,实际的问题是:如何在选项卡控件的末尾添加"config页“?最好是使用上面希望的方法,在CompositeCollection上添加一个额外的配置页面对象;但是,如果这不可能,我愿意听取建议。
1我认为它不起作用,因为{Binding }是一个ICollectionView,而CompositeCollection需要一个“集合”,并且不接受“视图”
谢谢。彼得。
发布于 2016-01-09 01:59:12
我决定通过后面的代码来完成它。这意味着我确实失去了使用设计时数据预览UI的能力;但是它在运行时工作。
所以在xaml中我有。
<controls:MetroTabControl Grid.Column="0" Grid.ColumnSpan="2"
Grid.Row="0" Grid.RowSpan="2"
ItemsSource="{Binding ElementName=ucMe, Path=TabSitesCollection}">其中ucMe是UserControl,TabSitesCollection是一个
protected CollectionViewSource m_TabSitesCollectionViewSource;
protected CompositeCollection m_TabSitesComposites;
public ICollectionView TabSitesCollection
{
get { return m_TabSitesCollectionViewSource.View; }
}在构造函数中初始化,如下所示
public ConfigSiteView()
{
m_TabSitesComposites = new CompositeCollection();
m_TabSitesCollectionViewSource = new CollectionViewSource();
m_TabSitesCollectionViewSource.Source = m_TabSitesComposites;
InitializeComponent();
}然后,在加载的事件上,我可以做
m_TabSitesComposites.Add(new CollectionContainer() { Collection = GetModel.View });
m_TabSitesComposites.Add(new TabItem() { Header = "hi" });
m_TabSitesComposites.Add(new TabItem() { Header = "ho" });这几乎导致了我想要的UI。

我现在只需要突出我的设置选项卡项目,我就完成了。作为参考,xaml设计器没有任何预览数据--除非我更改了xaml,使预览加载(然后中断实际执行)。
如果在运行时和预览时都能工作,那就太好了,但我还没有弄清楚如何做到这一点,而且这也不是当前的优先事项。
https://stackoverflow.com/questions/34652637
复制相似问题