2013-05-29 2 views
2

필터으로 내 데이터에 ComboBox을 바인딩하고 싶습니다. 이를 위해 TextBoxComboBox을 만들었습니다. 뒤에있는 코드에서 파일을 읽고 클래스 채널의 객체를 생성하여 ComboBox의 항목으로 저장합니다. 컴파일러에서 오류가 발생하지는 않지만 필터링이 제대로 작동하지 않습니다. 데이터를 지우면 지워집니다. 지우면 다시 나타납니다. 시도하고 시도한 후에 "myNamespace.myChannel"(Unico.Canal)을 입력하기 시작하면 데이터가 남아 있지만 필터링하지 않는다는 것을 깨달았습니다. 참 이상한 행동. 나는 잘못된 장소에 뭔가를 넣었다고 생각합니다.필터링 CollectionViewSource

namespace Unico 
{ 
     public partial class ControlesArchivo : UserControl, INotifyPropertyChanged 
     { 
      public ControlesArchivo() 
      { 

       InitializeComponent();   
      } 

    public ObservableCollection<Channel> myListChannels //with INotifyPropertyChanged implemented. But I think I don't need it. 

    private void loadButton_Click(object sender, RoutedEventArgs e) 
      { 

       File loadedFile = new File(); 
       loadedFile.read(); //Generates a bunch of data in lists. 

       foreach (Channel mychan in loadedFile.channels) //Just duplicating the data (maybe this can be avoided) 
        { 
        myListChannels.Add(mychan); 
        } 

     var view = CollectionViewSource.GetDefaultView(this.miListaDeCanales); 
         view.Filter = delegate(object o) 
         { 
          if (o.ToString().Contains(myTextBox.Text)) //Delicate place 
          { 
           return true; 
          } 
          return false; 
         }; 

       myComboBox.ItemsSource = view; 
    DataContext = this; 
    } 


    private void myTextBox_TextChanged(object sender, TextChangedEventArgs e) 
      { 


         ((ICollectionView)myComboBox.ItemsSource).Refresh(); 
         myComboBox.SelectedIndex = 0; 

      } 


     } 
    } 

이 데이터는에 바인딩 :

enter image description hereenter image description hereenter image description here

여기

내 코드의 제도입니다 (더 나은 이해를 위해 나는 코드, 운하 = 채널을 번역했습니다) XAML with :

ItemsSource="{Binding view}" 

편집 : 문제가있는 부분을 알고 있다고 생각합니다. 필터링 할 속성을 지정하지 않았습니다. 내 말은 ComboBox에서 볼 수있는 것은 의 channelName 속성이 myListChannels에 나열된 것입니다. 필터를 설정할 때 필터링 대상을 알려주지 않아야합니까? 나는 어떻게 이것을 쓸 수 있 었는가? 고맙습니다.

답변

1

예 가정은 정확합니다. 나는 당신의 번역과 있으리라 믿고있어

,

public ObservableCollection<Channel> myListChannels; 

는 네임 스페이스의 클래스 Canal와 실제로

public ObservableCollection<Canal> miListaDeCanales; 

입니다 Unico

업데이트 : 요에

ur 필터는 에서 렌더링 된 속성을 사용하여 ToString()System.Object에서 덮어 쓰지 않은 경우 object (o)의 ToString()을 사용하는 것보다 좋습니다.

시도 전환

if (o.ToString().Contains(myTextBox.Text)) 

문제를 해결해야

if (((Canal)o).NameProperty.Contains(myTextBox.Text)) 

^^

합니다.

xaml에 ComboBox.ItemTemplateDataTemplate이 있습니까? 그러면 ComboBox에서 유효한 값이 표시되는 이유를 알 수 있습니다. 그렇지 않은 경우 의 문자도 모두 Unico.Canal

+0

으로 렌더링됩니다. 내 영웅입니다. – Sturm

관련 문제