2016-09-21 31 views
2

誰かが私に助けてくれますか?点滅せずにListView ItemSourceにバインドされたObservableCollectionをどのように更新できますか?私がするとき:点滅のないObservableCollectionの更新

Contacs = _contacs; 

ListView全体が点滅しています。 ListViewでも検索したいのですが、古い結果を新しいものに置き換えた後は常にlistviewが点滅します。

+0

更新とはどういう意味ですか? OC全体を置き換えるか、レコードを追加/削除しますか? – AnjumSKhan

+0

コレクション全体を置き換えます。 – JuP

+0

@rbm「ダブルバッファリング」は、あなたが言う問題とは全く関係がないと言います。ユーザーは、舞台裏で何が起こるかをUIに通知するためのより良い方法を求めました。ダブルバッファはビットマップの最適化手法で、Winforms(UWP/WPFでは使用できません)に対してのみ有効です。 –

答えて

2

ここで問題となるのは、コレクション全体を再割り当てすることです。これは、可観測性を利用せず、ListViewにすべてのアイテムを再ロードさせます。 ListViewは、実際に変更された項目を更新する必要があるため、代わりに項目を削除/追加してください。

非表示検索の場合、不一致の結果も実行可能な解決策である可能性があります。これを行うには、Contactタイプ(たとえば "IsVisible"と呼ばれる)でプロパティを作成し、それをListViewItems Visibilityプロパティにバインドします。 (あなたがここBooleanToVisibilityコンバータでのビルドが必要になる場合があります)

更新

としては、CollectionViewSourceを使用して、コメントで指摘は、検索フィルタを実装するのが正しいのWPFの方法です。使用方法の詳細については、this答えを参照してください。

+0

コレクションを新しいデータに置き換えると、それが点滅します。ですから、私は既存のソースだけで作業し、アイテムを追加/削除する必要があります。あなたの検索ソリューションは良いです。 – JuP

+0

これは良いハックですが、CollectionViewSourceとICollectionViewを使ってそのような機能を組み込んでいるときは必要ありません。 –

+0

あなたはもちろん正しいです。私はあなたの答えを – vkluge

1

コレクションでフィルタリングを有効にする場合は、実際にコレクションで操作を行う必要はありません。

ICollectionViewCollectionViewSourceを使用してください。

あなたは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

+0

ありがとうございます。やってみます。 :) – JuP

+0

もちろん。それがどうなるか教えてください。私はあなたのフィルタリングロジックを分離するので、これをお勧めします。 –

+0

私には1つの問題があります。プロパティフィルタがUWPにありません:/ – JuP

関連する問題