たObjectDataProviderをリフレッシュする際にビューが失わ
-
23-08-2019 - |
質問
私は<のhref = "http://joshsmithonwpf.wordpress.com/2007/06/12/searching-for-items-in-a-でジョシュ・スミスの例に基づいて、リスト上のテキストボックスフィルタを実装していますリストボックス」のrel = "nofollowをさnoreferrer"> http://joshsmithonwpf.wordpress.com/2007/06/12/searching-for-items-in-a-listbox を。基本的には、検索ボックス内のテキストに対してチェックするデリゲートを視野にフィルタを設定します。私はそうのようなフィルタをフックアップします:
var pickerView = FindResource("sortedRulesView") as CollectionViewSource;
new TextSearchFilter(pickerView.View, SearchTextBox);
私はたObjectDataProviderを更新すると、その後、フィルタは失われます。私はpickerView.Viewは、リフレッシュ後の異なるハッシュコードを持っていることに気付きました。データが更新されたときに、すべてのビューが再作成されていますか?それは)(私が呼び出すたび、私は再びObjectDataProvider.Refreshをフィルタを再接続しなければならないということですか?ベビーシッターを必要としないこのフィルタをインストールするためにいくつかのよりスマートな方法はありますか?
解決
あなたはCollectionViewSource.Sourceが設定されている場合CollectionViewSource.Viewが交換されることを言うで正しい。
ソリューションは、 CollectionViewSourceを使用することです.Filter のイベントの代わりに、 CollectionView.Filter のプロパティ。あなたのビューがなくなったときにこれが固執されます。
あなたは「=ジョシュ・スミスの<のhref =「http://joshsmithonwpf.wordpress.com/2007/06/12/searching-for-items-in-a-listbox/」RELに最小限の変更でこれを行うことができますnofollowをnoreferrer "> TextSearchFilter のクラスます:
public class TextSearchFilter
{
public TextSearchFilter(
CollectionViewSource filteredView,
TextBox textBox )
{
string filterText = "";
filteredView.Filter += delegate( object obj, FilterEventArgs e )
{
if( String.IsNullOrEmpty( filterText ) )
e.Accepted = true;
string str = e.Item as string;
if( String.IsNullOrEmpty( str ) )
e.Accepted = false;
int index = str.IndexOf(
filterText,
0,
StringComparison.InvariantCultureIgnoreCase );
e.Accepted = index > -1;
};
textBox.TextChanged += delegate
{
filterText = textBox.Text;
filteredView.View.Refresh();
};
}
}
あなたのフックアップコードはその後になります:
var pickerView = FindResource("sortedRulesView") as CollectionViewSource;
new TextSearchFilter(pickerView, SearchTextBox);