誰かが私に助けてくれますか?点滅せずにListView ItemSourceにバインドされたObservableCollectionをどのように更新できますか?私がするとき:点滅のないObservableCollectionの更新
Contacs = _contacs;
ListView全体が点滅しています。 ListViewでも検索したいのですが、古い結果を新しいものに置き換えた後は常にlistviewが点滅します。
誰かが私に助けてくれますか?点滅せずにListView ItemSourceにバインドされたObservableCollectionをどのように更新できますか?私がするとき:点滅のないObservableCollectionの更新
Contacs = _contacs;
ListView全体が点滅しています。 ListViewでも検索したいのですが、古い結果を新しいものに置き換えた後は常にlistviewが点滅します。
ここで問題となるのは、コレクション全体を再割り当てすることです。これは、可観測性を利用せず、ListViewにすべてのアイテムを再ロードさせます。 ListViewは、実際に変更された項目を更新する必要があるため、代わりに項目を削除/追加してください。
非表示検索の場合、不一致の結果も実行可能な解決策である可能性があります。これを行うには、Contactタイプ(たとえば "IsVisible"と呼ばれる)でプロパティを作成し、それをListViewItems Visibilityプロパティにバインドします。 (あなたがここBooleanToVisibilityコンバータでのビルドが必要になる場合があります)
更新が
としては、CollectionViewSourceを使用して、コメントで指摘は、検索フィルタを実装するのが正しいのWPFの方法です。使用方法の詳細については、this答えを参照してください。
コレクションでフィルタリングを有効にする場合は、実際にコレクションで操作を行う必要はありません。
ICollectionView
とCollectionViewSource
を使用してください。
あなたはObservableCollection
ですので、このようなことができます。
ICollectionView contactsView;
public ICollectionView ContactsView
{
get { return contactsView; }
set
{
if(contactsView != value)
{
contactsView = value;
}
}
}
そしてContactsFilter
は、次のように定義された関数であるObservableCollection
public ObservableCollection<ContactType> Contacs
{
get { return _contacs; }
set
{
if(_contacs != value)
{
_contacs = value;
ContactsView = CollectionViewSource.GetDefaultView(value);
ContactsView.Filter = ContactsFilter;
}
}
}
のセッターインチ
bool ContactsFilter(object item)
{
var contact = item as ContactType;
if(condition)
return true; //show this item in ListView.
return false; //Do not show this item in ListView
}
、あなたはちょうど私があなたが検索クエリを入力するテキストボックスのTextChanged
イベントになると思う
ContactsView.Refresh();
によって、あなたがそれを行うことができますアイテムをフィルタリングしたいとき。
さらに詳しい記事はCollectionViewSource
更新とはどういう意味ですか? OC全体を置き換えるか、レコードを追加/削除しますか? – AnjumSKhan
コレクション全体を置き換えます。 – JuP
@rbm「ダブルバッファリング」は、あなたが言う問題とは全く関係がないと言います。ユーザーは、舞台裏で何が起こるかをUIに通知するためのより良い方法を求めました。ダブルバッファはビットマップの最適化手法で、Winforms(UWP/WPFでは使用できません)に対してのみ有効です。 –