首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包含CompositeCollection的ICollectionView

包含CompositeCollection的ICollectionView
EN

Stack Overflow用户
提问于 2016-01-07 10:21:44
回答 1查看 102关注 0票数 1

我正在尝试实现一个选项卡控件,其中每个项都来自我的视图模型的ICollectionView。对于来自ICollectionView的项,每个选项卡页都是相同的。不过,我希望有一个额外的选项卡页的配置选项。

因此,选项卡标题“屏幕快照”的示例可能是:

代码语言:javascript
复制
tabA | tabB | tabC | config

在另一个例子中,它可能是

代码语言:javascript
复制
tabA | config

代码语言:javascript
复制
config

我可以使用ItemTemplateSelectors定义每个项的标题,使用ContentTemplateSelectors定义内容。所以那部分应该没问题。

我在添加配置页面项时遇到了问题,因为我不知道在哪里添加它。我想我可以将选项卡的ItemsSource设置为CompositeCollection,其中最后一项是配置页面对象。我未能做到这一点。

在下面的示例中,我可以根据我设置的designer示例数据查看正在正确填充的选项卡标题--我还没有添加配置页面。

代码语言:javascript
复制
        <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。

理想情况下,我可以做一些魔法,比如:

代码语言:javascript
复制
        <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,如下所示。

代码语言:javascript
复制
<DockPanel DataContext="{Binding Source={StaticResource Configurator}}"
            d:DataContext="{d:DesignInstance cfuid:ConfigSiteVMSampleData, IsDesignTimeCreatable=true}"
            LastChildFill="True">

作为参考,Configurator是我的视图模型,在xaml中实例化为:

代码语言:javascript
复制
<UserControl.Resources>
    <ResourceDictionary>
        ...snip...
        <cfvmc:ConfigSiteVM x:Key="Configurator" />
        ...snip...

因此,实际的问题是:如何在选项卡控件的末尾添加"config页“?最好是使用上面希望的方法,在CompositeCollection上添加一个额外的配置页面对象;但是,如果这不可能,我愿意听取建议。

1我认为它不起作用,因为{Binding }是一个ICollectionView,而CompositeCollection需要一个“集合”,并且不接受“视图”

谢谢。彼得。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-09 01:59:12

我决定通过后面的代码来完成它。这意味着我确实失去了使用设计时数据预览UI的能力;但是它在运行时工作。

所以在xaml中我有。

代码语言:javascript
复制
        <controls:MetroTabControl Grid.Column="0" Grid.ColumnSpan="2"
                Grid.Row="0" Grid.RowSpan="2"
                ItemsSource="{Binding ElementName=ucMe, Path=TabSitesCollection}">

其中ucMe是UserControl,TabSitesCollection是一个

代码语言:javascript
复制
    protected CollectionViewSource m_TabSitesCollectionViewSource;
    protected CompositeCollection m_TabSitesComposites;
    public ICollectionView TabSitesCollection
    {
        get { return m_TabSitesCollectionViewSource.View; }
    }

在构造函数中初始化,如下所示

代码语言:javascript
复制
    public ConfigSiteView()
    {
        m_TabSitesComposites = new CompositeCollection();
        m_TabSitesCollectionViewSource = new CollectionViewSource();
        m_TabSitesCollectionViewSource.Source = m_TabSitesComposites;

        InitializeComponent();
    }

然后,在加载的事件上,我可以做

代码语言:javascript
复制
        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,使预览加载(然后中断实际执行)。

如果在运行时和预览时都能工作,那就太好了,但我还没有弄清楚如何做到这一点,而且这也不是当前的优先事项。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34652637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档