2

これには免責事項を前置きしなければなりません。私は初心者のプログラマーです。これを何日も自分で解決しようとしましたが、アイデア/ブログ投稿/ウォークスルーおよびその他のソースが完全に不足しています。お時間を割いてお読みいただき、ご返信いただければ幸いです。

開発中のゲームにスコアループを統合しようとしていますが、データ バインディングとリストボックスで非常に奇妙な結果が得られます。私のテスト (以下) は、バインディングに何か問題があることを示唆していますが、クレイジーなことは、最初に使用したときに実際に機能しますが、それ以降のレベルでは機能しません。私が使用している重要なコードは次のとおりです。

XAML:

<ListBox x:Name="LeftListBox" Margin="12,48,0,128" ItemsSource="{Binding}" Background="{x:Null}" HorizontalAlignment="Left" Width="240">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Margin="0,0,0,17">
                        <StackPanel Margin="0,0,0,0" Orientation="Horizontal" HorizontalAlignment="Left">
                            <TextBlock Text="{Binding Rank}" TextWrapping="NoWrap"  />
                            <TextBlock Text="." Width="54"/>
                            <TextBlock Text="{Binding Result}" TextWrapping="NoWrap" Width="76"/>
                            <TextBlock Text="{Binding User.Login}" TextWrapping="NoWrap"/>
                        </StackPanel>                           
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>             
        </ListBox>

スコアが読み込まれるたびに発生するようにイベントを登録しました。これにより、バインディングが設定され、デバッグ メッセージがログに記録されます。

LeftListBox.DataContext = App._scoresController.Scores;
Debug.WriteLine("Scores Loaded");  

App._scoresController.Scores には、User.Login、Rank、および Result が含まれています。

レベルをクリアした後、期待どおりにスコアがプルダウンされ、リストボックスに表示されます。リストボックスは空白ですが、次のレベルの同じサイクルを通過するとすぐに。「Scores Loaded」のデバッグ行は常にログに記録されるため、イベントが発生していることがわかります。

これまでにテストで行ったこと:

  1. バインディングのロギングのために ALL をオンにしましたが、出力に何も記録されていませんでした。
  2. デバッグの「Scores Loaded」行にブレークポイントを設定すると、そこにヒットするたびに、データコンテキストが正しく割り当てられ、正確に一致する名前を持つ正しいフィールドが表示されることがわかります
  3. Dispatcher.BeginInvoke(LoadScores); を使用してみました。これがどういうわけかスレッドの問題であった場合に備えて、UIスレッドからそれを行っていたことを確認してください
  4. スタックパネルの背景色を、別のコントロールやストーリーボード アニメーションによって折りたたまれたり隠されたりしないようにするために使用できる色に設定します。
  5. 同じリストボックスのコピーを作成し、同じ LoadScores() メソッドで listbox.datacontext = this を設定してから、バインド先のローカル変数を設定します。これは同じ動作を示し、2回目にデータコンテキストを設定すると消えてしまうことがわかりました
  6. リストボックスのコピーを作成し、すべてのバインディングを削除して、3 つのテキスト フィールドを手動で設定しました。これは消えることはありませんでしたが、レベルをクリアするたびに表示されました
  7. 1 つのレベルをクリアして (動作させる)、別のレベルをクリアして (非表示にする)、ゲームプレイが行われる gamepage.xaml/gamepage.xaml.cs から離れて (mainpage.xaml に移動してから、ゲームページに戻るなど) . これで問題は解決しないので、問題は gamepage.xaml/gamepage.xaml.cs 内の何かよりも上位にあると想定しています

私は痛々しいほど愚かで明白なことをしなければならないと感じていますが、私は初心者のプログラマーであり、必要に応じて断片を拾い上げているだけであり、これがデータ バインディングの世界への最初の冒険です。提案をいただければ幸いです。

お時間をいただきありがとうございます。

4

1 に答える 1

0

問題が見つかりました。GamePage.xaml.cs と Gamepage.xaml から離れることはないと言ったのは間違いでした。

コードを見直したところ、実際には次のレベルの詳細を一覧表示する遷移ページにジャンプしてから、GamePage に戻っていることがわかりました。

ページを離れるたびに、App._scoresController.Scores に奇妙なことが起こります。GamePage.xaml.cs 内にプライベート _scoresController.Scores を作成し、App の代わりにそれを使用すると、すべてが機能します。Scoreloop では何かおかしいようです。

于 2012-05-17T18:24:19.567 に答える