首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LongListSelector和DataTemplateSelector

LongListSelector和DataTemplateSelector
EN

Stack Overflow用户
提问于 2013-10-30 18:16:31
回答 1查看 4K关注 0票数 8

我正在使用LongListSelector来实现项目的列表或网格显示。为此,我创建了一个DataTemplateSelector,并在运行时更改了LayoutMode属性。这是可行的,但DataTemplateSelector似乎存在一个问题。如果我最初启动该页面,那么对于我的三个项目,DataTemplateSelector会被调用三次。当我导航到另一个页面(设置页面以更改LayoutMode),然后返回时,DataTemplateSelector只被称为两个项,但仍然有三个项。

DataTemplateSelector:

代码语言:javascript
复制
public abstract class DataTemplateSelector : ContentControl
{
    public virtual DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        return null;
    }

    protected override void OnContentChanged(object oldContent, object newContent)
    {
        base.OnContentChanged(oldContent, newContent);

        ContentTemplate = SelectTemplate(newContent, this);
    }
}

ItemViewModeTemplateSelector:

代码语言:javascript
复制
public class ItemViewModeTemplateSelector: DataTemplateSelector
{
    public DataTemplate ListViewModeTemplate
    {
        get;
        set;
    }

    public DataTemplate GridViewModeTemplate
    {
        get;
        set;
    }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        ViewMode viewMode = ViewMode.Grid;

        // Get ViewMode from IsolatedStorageSettings...

        switch (viewMode)
        {
            case ViewMode.Grid:
                return GridViewModeTemplate;

            case ViewMode.List:
                return ListViewModeTemplate;
        }

        return base.SelectTemplate(item, container);
    }
}

MainPage.xaml:

代码语言:javascript
复制
<phone:LongListSelector x:Name="ItemLongListSelector" ItemsSource="{Binding Items}" LayoutMode="Grid" GridCellSize="222,222">
    <phone:LongListSelector.ItemTemplate>
        <DataTemplate>
            <common:ItemViewModeTemplateSelector Content="{Binding}" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
                <common:ItemViewModeTemplateSelector.GridViewModeTemplate>
                    <DataTemplate>
                        <StackPanel Margin="12,12,0,0" Background="{Binding Color, Converter={StaticResource ColorToBrushConverter}}">
                            <!-- Content -->
                        </StackPanel>
                    </DataTemplate>
                </common:ItemViewModeTemplateSelector.GridViewModeTemplate>

                <common:ItemViewModeTemplateSelector.ListViewModeTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <!-- Content -->
                        </StackPanel>
                    </DataTemplate>
                </common:ItemViewModeTemplateSelector.ListViewModeTemplate>
            </common:ItemViewModeTemplateSelector>
        </DataTemplate>
    </phone:LongListSelector.ItemTemplate>
</phone:LongListSelector>

这是我最初启动页面时的显示:

然后导航到另一页,然后返回:

编辑:我为这个问题准备了一个示例项目。它应该没有问题地运行。

项目:http://sdrv.ms/1cAbVxE

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-06 17:01:33

我对我的应用程序做了类似的事情,但允许用户使用Appbar按钮选择LLS的LayoutMode。我基本上改变了LongListSelector.LayoutMode,然后在代码中是ItemTemplate,LLS会自动刷新自己。我不确定这会不会有帮助,但这是我的代码。

代码语言:javascript
复制
private void layoutModeButton_Click(object sender, EventArgs e)
    {
        ApplicationBarIconButton layoutModeButton = (ApplicationBarIconButton)ApplicationBar.Buttons[0];

        if (MainLongListSelector.LayoutMode == LongListSelectorLayoutMode.Grid)
        {
            MainLongListSelector.LayoutMode = LongListSelectorLayoutMode.List;
            MainLongListSelector.ItemTemplate = this.Resources["ListListLayout"] as DataTemplate;
            layoutModeButton.IconUri = _gridButtonUri;
            layoutModeButton.Text = "grid";
        }
        else
        {
            MainLongListSelector.LayoutMode = LongListSelectorLayoutMode.Grid;
            MainLongListSelector.ItemTemplate = this.Resources["GridListLayout"] as DataTemplate;
            layoutModeButton.IconUri = _listButtonUri;
            layoutModeButton.Text = "list";
        }
    }

您可能已经找到了答案,但只是想补充一下:对于相当多的数据,这给了我很好的性能。也许在更改了设置中的布局后,当导航回到页面时,您可以做类似的事情?

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

https://stackoverflow.com/questions/19690789

复制
相关文章

相似问题

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