gpt4 book ai didi

c# - LongListSelector 和 DataTemplateSelector

转载 作者:太空狗 更新时间:2023-10-29 18:31:52 32 4
gpt4 key购买 nike

我正在使用 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);
}
}

ItemViewModeTemplateSelector:

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>

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

然后我导航到另一个页面然后返回:

编辑:我为此问题准备了一个示例项目。它应该可以正常运行。

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

最佳答案

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

我还添加了一个 code研究哪个(非常简单)。

关于c# - LongListSelector 和 DataTemplateSelector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19690789/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com