2010-08-03 2 views
1

특정 디렉토리에서 검색된 파일 이름을 목록 상자에 표시하려고합니다. 그들은에서는 FileInfo 개체의 ObservableCollection에에 저장됩니다 같은에서변환기가 필터 작업을 중지합니다.

private void FilterFiles_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    ICollectionView view = CollectionViewSource.GetDefaultView(ProjectFiles); 
    view.Filter = new Predicate<object>(IsTextInFilename); 
} 

public bool IsTextInFilename(object item) 
{ 
    string Filename = Path.GetFileNameWithoutExtension((item as FileInfo).Name); 
    return (Filename.ToLower().Contains(FilesFilterBy.Text.ToLower())); 
} 

:

public ObservableCollection<FileInfo> ProjectFiles 
{ 
    get 
    { 
     if (SelectedFolder == null) return null; 

     DirectoryInfo d= new DirectoryInfo(SelectedFolder); 

     if (!d.Exists) return null; 

     return new ObservableCollection<FileInfo>(d.EnumerateFiles("*.xsi")); 
    } 
} 

나는 텍스트가 텍스트 상자 "FilesFilterBy"에 입력되거나 변경 될 때 호출 목록 상자에 필터를 구현 시간, 경로 또는 확장명없이 파일 이름 만 표시하려고합니다. 파일 이름 만 나열되어 있지만, 더 이상 필터 -

<Window.Resources> 
    <ctr:RemoveExtensionConverter x:Key="JustFileName" /> 
</Window.Resources> 

<ListBox ItemsSource="{Binding ProjectFiles}" > 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <TextBlock Text="{Binding FullName, Converter={StaticResource JustFileName}}" /> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

현재 컨버터가 작동합니다

여기
public class RemoveExtensionConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
    return Path.GetFileNameWithoutExtension(value as string); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return new NotImplementedException(); 
    } 
} 

이 목록 상자는 XAML에서 구현되지 않은 방법 :이를 위해 내가 변환기를 구현 어떤 효과가있다. FileFilterBy 텍스트 상자에 텍스트를 입력하면 TextChanged 이벤트가 발생하지만 목록 상자는 그대로 유지됩니다. 또한 변환기는이 시점에서 호출되지 않습니다.

내가 뭘 잘못하고 있니?

답변

2

ProjectFiles는 매번 새 컬렉션을 반환합니다. FilterFiles_TextChanged 처리기가 ProjectFiles를 호출하여 새 컬렉션을 만들고 필터를 새 컬렉션에 설정 한 다음 버립니다. ListBox에 바인딩 된 컬렉션은 영향을받지 않습니다. 같은 컬렉션 개체를 유지하려면 ProjectFiles를 변경해야합니다. 다음과 같은 내용 일 수 있습니다.

private ObservableCollection<FileInfo> _projectFiles; 
public ObservableCollection<FileInfo> ProjectFiles 
{ 
    get 
    { 
     if (_projectFiles == null) 
     { 
      if (SelectedFolder == null) return null; 

      DirectoryInfo d = new DirectoryInfo(SelectedFolder); 

      if (!d.Exists) return null; 

      _projectFiles = new ObservableCollection<FileInfo>(
       d.EnumerateFiles("*.xsi")); 
     } 
     return _projectFiles; 
    } 
} 

변환기가 필터에 전혀 영향을 미치지 않아야합니다.

+0

감사합니다. –

관련 문제