Элементы, переупорядоченные в 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 работает правильно, как и должно (с соглашениями в шаблоне элемента).