8

アイテムのリスト表示またはグリッド表示を実現するために、LongListSelector を使用しています。このために、DataTemplateSelector を作成し、実行時に LayoutMode プロパティを変更しました。これは機能していますが、DataTemplateSelector に問題があるようです。最初にページを起動すると、3 つの項目に対して DataTemplateSelector が 3 回呼び出されます。別のページ (LayoutMode を変更するための設定ページ) に移動してから戻ると、DataTemplateSelector は 2 つの項目と呼ばれますが、まだ 3 つの項目があります。

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

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

4

3 に答える 3

4

私は解決策を持っていませんが、問題を解決する誰かの手がかりになるかもしれません。
問題は LongListSelector.UpdateLayout() メソッドにあると思います-初めて起動されたとき、LLS がバインドされたアイテムはありません-OnChangeMethod は Itemsource.Count と同じ回数呼び出されます。しかし、ページを離れて戻ると、LLS が更新され、中間要素を省略してメソッドが呼び出されます。
これは、偶数のアイテムに対して機能することを意味します-OnChangeMethodは正しい回数呼び出されますが、奇数のアイテムの場合-それはアイテムの数-1と呼ばれます.2
番目のことは、変更がないときにまったく呼び出される理由です. また、作業するコード

を 追加します(非常に単純です)。

于 2013-11-06T12:50:14.743 に答える