Frage

Ich bin die Implementierung einer Textbox Filter auf einer Liste basiert auf Josh Smiths Beispiel unter http://joshsmithonwpf.wordpress.com/2007/06/12/searching-for-items-in-a-listbox . Im Grunde ist es setzt den Filter auf die Ansicht auf einen Delegaten, der gegen den Text in das Suchfeld überprüft. Ich die Filter anschließen etwa so:

var pickerView = FindResource("sortedRulesView") as CollectionViewSource;
new TextSearchFilter(pickerView.View, SearchTextBox);

Später, als ich die Object aufzufrischen, wird der Filter verloren. Ich habe bemerkt, dass pickerView.View einen anderen Hash-Code nach dem Refresh hat. Sind alle Ansichten neu erstellt, wenn die Daten aktualisiert? Heißt das, ich sollte den Filter wieder wieder anbringen, wenn ich ObjectDataProvider.Refresh () aufrufen? Gibt es eine intelligente Möglichkeit, diese Filter zu installieren, die nicht Babysitter benötigen würden?

War es hilfreich?

Lösung

Du hast Recht wenn er sagt, dass CollectionViewSource.View ersetzt werden, wenn CollectionViewSource.Source eingestellt ist.

Die Lösung ist die Collection .Filter Ereignis statt des CollectionView.Filter Eigenschaft. Dies wird dableiben, wenn Ihr Blick geht weg.

Sie können dies tun, mit minimalen Änderungen an Josh Smith TextSearchFilter Klasse:

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();
        };
    }
}

Ihr hookup Code wird dann:

var pickerView = FindResource("sortedRulesView") as CollectionViewSource;
new TextSearchFilter(pickerView, SearchTextBox);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top