문제

Josh Smith의 예제를 기반으로 목록에 텍스트 상자 필터를 구현하고 있습니다. 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는 새로 고침 후 해시 코드가 다른 것을 알았습니다. 데이터가 새로 고침 될 때 모든 견해가 재현됩니까? 객체 dataprovider.refresh ()를 호출 할 때마다 필터를 다시 재개해야한다는 의미입니까? 베이비 시팅이 필요하지 않은이 필터를 설치하는 더 똑똑한 방법이 있습니까?

도움이 되었습니까?

해결책

CollectionViewSource.source가 설정되면 CollectionViewSource.view가 대체 될 것이라고 말하는 것이 맞습니다.

해결책은 CollectionViewSource.Filter 대신 이벤트 CollectionView.Filter 재산. 이것은 당신의 견해가 사라질 때 주위에 붙어 있습니다.

Josh Smith의 최소한의 변경 으로이 작업을 수행 할 수 있습니다. 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);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top