0

私の WP8 アプリでは、LongListSelector を使用してデータ項目を表示しています。グループ化が機能し、ジャンプ リストが機能します。

ここには通常のマスター/詳細シナリオがあります。リスト内のアイテムをクリックすると、新しいページが詳細情報とともに表示されます。

問題は、LongListSelector を使用してページに戻ることです。リストは基本的にめちゃくちゃです -グループ間であっても、アイテムはランダムに並べ替えられます。アイテムのクリックは正しく機能します -ShowItemInfoユーザーがクリックしたアイテムのビュー モデルを受け取ります。

以前は ListBox を使用していましたが、これもこの問題に悩まされていました。しかし、デフォルトの StackPanel を項目パネルとして使用することで、仮想化を無効にすることができました。LongListSelector で仮想化を無効にする方法がわかりません (そうしたくありませんが、バグがひどいです)。

ビューモデルはシンプルです。私はCaliburn.Micro、その規則、およびBindableCollectionグループのリストを使用しています。メソッドを使用してリストに一度だけ入力しますAddRange

ページに戻ったとき、私は何もしていません。MVVM と Caliburn.Micro を使用しているので、何もできません。アイテムはOnInitializeコールバックでリストにロードされます。これは、ビュー モデルの有効期間中に 1 回だけ呼び出されます。

ビューの 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>
4

1 に答える 1

0

問題をデータ テンプレート、具体的には添付プロパティに絞り込みました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.ModelWithoutContextLongListSelector を使用すると、必要に応じて適切に機能します (項目テンプレートの規則を使用) 。

于 2015-05-10T11:08:00.017 に答える