LongListSelector 和 DataTemplateSelector

2023-12-30

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

数据模板选择器:

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);
    }
}

项目视图模式模板选择器:

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);
    }
}

主页.xaml:

<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>

This is the display when I initially launch the page:

Then I navigate to another page and then back:

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

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


我还没有找到解决方案,但也许可以为解决问题的人提供线索。
我认为问题出在 LongListSelector.UpdateLayout() 方法上 - 当第一次触发它时,没有绑定 LLS 的项目 - OnChangeMethod 被调用多次,就像 Itemsource.Count 一样。但是当我们离开页面并返回时 - LLS 已更新并且调用方法并忽略中间元素。
这意味着它适用于偶数个项目 - OnChangeMethod 被调用正确的次数,但对于奇数个项目 - 它被称为项目数 - 1。
第二件事是为什么在没有任何变化的情况下调用它。

我还添加一个code http://sdrv.ms/17qDLdk致力于其中(非常简单)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LongListSelector 和 DataTemplateSelector 的相关文章

随机推荐