2011-12-31 4 views
1

私はシンプルなデータブラウジングコマンドで単純なMVVM WPFアプリケーションを実装しています。WPF ListBoxで新しいリストを設定するにはどうすればいいですか?

WHERE句

<TextBox Grid.Column="2" Grid.Row="6" Margin="0,5,10,5" Name="textBoxWhereClause" /> 

者を挿入するテキストボックスがあるだけでなく、リストボックス

<ListBox x:Name="listBoxPersons" ItemsSource="{Binding Path=Persons}" SelectedIndex="{Binding Path=SelectedPerson, Mode=OneWayToSource}" Grid.Column="1" Grid.Row="0" Grid.ColumnSpan="2" Margin="0,10,10,5" IsSynchronizedWithCurrentItem="True"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <TextBlock Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}" /> 
       </StackPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

とXAMLウィンドウがありますがのObservableCollectionです。私は人のための簡単な追加/削除/変更コマンドを実装しました。これは機能します。

質問:ユーザーが新しいクエリを実行して完全に新しいコレクションを作成した場合、どうすればいいですか?新しいコレクションをどのようにリストボックスに動的にバインドできますか?

私は初心者で無力です。

ご協力いただきありがとうございます。

+1

Persons Collectionをクリアし、空のコレクションを新しい結果で埋めることができます。 – BigL

+0

はい、本当にありがとうございますが、テーブルには約5万人がいます。これによりパフォーマンスが低下する可能性があります。 – PeterP

+1

Haris Hassanは、バインドされたコレクションを新しくロードしたコレクションに簡単に変更できると答えました。そして、あなたのパフォーマンスに対処するために、別のタスクで新しいコレクションをバックグラウンドで読み込むことができます。 – BigL

答えて

1

How can I bind the new collection dynamically to the listbox?

あなたはバインディングをリセットする必要はありません。バインディングは既に存在しているので、バインド元を更新するだけで済みます。

単にあなたが新しく取得した結果と

Personsコレクションを交換する必要があなたはPerson = YourNewCollection; //新規に取得した結果

を行うことができ、あなたのビューモデルでこれに似たような

private ObservableCollection<Person> _Person ; 
public ObservableCollection<Person> Person 
{ 
    get 
    { 
     return _Person; 
    } 
    set 
    { 
     _Person = value; 
     OnPrpertyChanged("Person"); 
    } 
} 

を持っている必要があります

but there are about 50,000 persons in the table. This could result in performance difficulties

あなたができることは2つあります

1)一度に限られた数のレコードを取得し、次の戻るボタンをユーザに提供します。ページングの種類。

2)ListBoxでvirtualizationオプションを使用すると、UIが応答性と効率が高くなります。特定の時点で表示可能なPersonコレクションからリストボックスにロードされたオブジェクトのみを確認します。

関連する問題