2011-01-27 15 views
1

私はカスタムクラスの観測可能なコレクションにバインドされているリストを持っています。完璧に動作します。Silverlightリストボックスバインディングの質問

最後に、観測可能なコレクションの一部ではない最後の行を追加したいときは、リストボックスに多くのアイテムを読み込む関数をトリガーする必要があります。

<Border ...> 
    <ScrollViewer x:Name="ScrollViewer" ...> 
    <ItemsPresenter /> 
    </ScrollViewer> 
</Border> 

ItemsPresenterItemsSourceから要素をレンダリングするものです:

おかげ Erphanラージプート

+2

なぜこれをやりたいですか?コレクションに追加するアイテムの作成にはコストがかかりますか?標準のListBoxコントロールを使用していますか? – AnthonyWJones

+0

可能ですが、リストボックスの最後の行ではありません。それは分離されたコントロールとして見えます。 – vorrtex

+0

コレクションにデータを徐々にロードしようとしていますか? – WiredPrairie

答えて

0

は、リストボックスのデフォルトのテンプレートは次のようになります。あなたについてのようなものにデフォルトのテンプレートを上書き何

<Border ...> 
    <ScrollViewer x:Name="ScrollViewer" ...> 
    <StackPanel> 
     <ItemsPresenter ... /> 
     <!-- Your Control Here --> 
    </StackPanel> 
    </ScrollViewer> 
</Border> 
+0

これで、この余分なコントロールがスクロールされたことがどのように検出されましたか? – AnthonyWJones

0

私は、これはSilverlightのコントロールから現在の制限を考慮すると、右のアプローチであれば提案してくださいこれを行う方法を考え出しました。

<ListBox x:Name="MyListBox" ItemsSource="{Binding MyObservableCollection}" 
    ItemTemplate="{StaticResource ItemDisplayTemplate}" 
    ManipulationCompleted="MyListBox_ManipulationCompleted"/> 

CSで:XAMLで

private void MyListBox_ManipulationCompleted(object sender, 
     System.Windows.Input.ManipulationCompletedEventArgs e) 
{ 
    ScrollViewer sv = Utility.FindScrollViewerRecursive((ListBox)sender); 
    int a = Int32.Parse(Math.Round(sv.VerticalOffset).ToString()) + 
     Int32.Parse(Math.Round(sv.ViewportHeight).ToString()); 
    if ((a + 1) >= sv.ExtentHeight) 
    { 
     Debug.WriteLine("Should start loading new items in background"); 
    } 
    Debug.WriteLine(sv.VerticalOffset + " - " + sv.ViewportHeight + " - " + sv.ExtentHeight); 
} 

は、私はここからFindScrollViewerRecursiveをとっているhttp://blogs.msdn.com/b/rohantha/archive/2010/09/12/silverlight-wp7-list-scroll-with-items-as-image-description-from-web-bing-image-search.aspx

私はすぐに完全なサンプルソースコードを投稿します

...についてこの方法が問題ないかどうかを今すぐお勧めします。

+0

これは有効なアプローチのように見えますが、コードの一部はおそらくより良い方法で記述することができます。 'int a = Int32.Parse(Math.Round(sv.VerticalOffset).ToString())'?本当に? –

+0

はい!これはもっと分かりやすく、ロギングするためにこれを行うことができます...これはif((sv.VerticalOffest + sv.ViewportHeight + 1)> = sv.ExtendedHeight){//新しいデータをロード}のように行うことができます。スクロールバーのほとんどの端より少し早い - さらに、ScrollViewerがnullでないかどうかチェックする... –

関連する問題