Элементы, переупорядоченные в LongListSelector

В моем приложении WP8 я использую LongListSelector для отображения элементов данных. Группировка работает, список переходов работает.

У меня есть обычный сценарий мастер / детализация - нажмите на элемент в списке, появится новая страница с дополнительной информацией.

Проблема в том, чтобы вернуться на страницу с помощью LongListSelector. Список в основном запутан - элементы расположены в случайном порядке, даже между группами. Нажатие на элемент работает правильно - ShowItemInfo получает модель представления для элемента, на который нажал пользователь.

Ранее я использовал ListBox, который тоже страдал от этой проблемы. Но я мог бы отключить виртуализацию, используя StackPanel по умолчанию в качестве панели элементов. Я не знаю, как отключить виртуализацию в LongListSelector (не хочу, но ошибка ужасна).

Посмотреть модель просто. Я использую Caliburn.Micro, его соглашения и BindableCollection для списка групп. Я заполняю список только один раз AddRange метод.

Когда к странице возвращаются, я ничего не делаю - и даже не могу, так как использую MVVM и Caliburn.Micro. Элементы загружаются в список в OnInitialize обратный вызов, который вызывается только один раз за время существования модели представления.

XAML для просмотра это:

<Grid x:Name="LayoutRoot" Background="Transparent">
    <Grid.Resources>
        <phone:JumpListItemBackgroundConverter x:Key="BackgroundConverter"/>
        <phone:JumpListItemForegroundConverter x:Key="ForegroundConverter"/>

        <Style x:Key="ListJumpListStyle" TargetType="phone:LongListSelector">
            <Setter Property="ItemTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <Border Background="{Binding Converter={StaticResource BackgroundConverter}}"
                                HorizontalAlignment="Stretch">
                            <TextBlock Text="{Binding GroupTitle}" 
                                       Foreground="{Binding Converter={StaticResource ForegroundConverter}}" />
                        </Border>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Grid.Resources>

    <phone:LongListSelector x:Name="Items" LayoutMode="List" IsGroupingEnabled="True"
                            JumpListStyle="{StaticResource ListJumpListStyle}">

        <phone:LongListSelector.ItemTemplate>
            <DataTemplate>
                <Grid cal:Bind.Model="{Binding}"
                      cal:Message.Attach="[Event Tap] = [ShowItemInfo($dataContext)]"
                      Background="Transparent">
                    <TextBlock x:Name="ItemText" Style="{StaticResource PhoneTextTitle2Style}" />
                </Grid>
            </DataTemplate>
        </phone:LongListSelector.ItemTemplate>

        <phone:LongListSelector.GroupHeaderTemplate>
            <DataTemplate>
                <Border>
                    <TextBlock Text="{Binding GroupTitle}" />
                </Border>
            </DataTemplate>
        </phone:LongListSelector.GroupHeaderTemplate>

    </phone:LongListSelector>
</Grid>

1 ответ

Решение

Я сузил вопрос к шаблону данных, а точнее к прикрепленному свойству Bind.Model, что позволяет Caliburn.Micro связать модель представления для просмотра:

<DataTemplate>
    <Grid cal:Bind.Model="{Binding}"
          cal:Message.Attach="[Event Tap] = [ShowItemInfo($dataContext)]"
          Background="Transparent">
        <TextBlock x:Name="ItemText" Style="{StaticResource PhoneTextTitle2Style}" />
    </Grid>
</DataTemplate>

Когда это представление изменяется, чтобы использовать явные привязки вместо соглашений (и Bind.Model прикрепленное имущество удаляется), LongListSelector работает как шарм.

Я считаю, что в Caliburn.Micro должна быть ошибка, которая вызывает эту проблему. Первоначально я думал, что ошибка была в версии 1.5.2, которую я использую (к сожалению, я должен), и что она была исправлена ​​в новых версиях 2.x. Однако это не так, ошибка все еще проявляется в последней стабильной версии 2.0.2.

Я использовал эту технику в WPF без каких-либо проблем. Я также пытался запустить приложение в эмуляторах для WP8.0 и WP8.1, но поведение такое же.

Если кто-нибудь узнает, что является причиной этой ошибки (или исправлена ​​новая версия Caliburn.Micro), смело редактируйте ответ или оставляйте комментарий. Я был бы рад снова использовать условные обозначения в шаблонах данных.

Моя ошибка: для шаблонов данных, Bind.ModelWithoutContext должен быть использован. Даже в документации явно сказано так:

Bind.ModelWithoutContext - View-First - устанавливает Action.Target для указанного экземпляра. Применяет условные обозначения к представлению. (Используйте внутри DataTemplate.)

С Bind.ModelWithoutContext LongListSelector работает правильно, как и должно (с соглашениями в шаблоне элемента).

Другие вопросы по тегам