2013-05-29 4 views
2

Я хочу сделать ComboBox привязан к моим данным, используя фильтр . Для этого я создал TextBox и ComboBox. В коде позади я читаю файл и генерирую объекты класса Channel, которые хранятся как элементы ComboBox. Хотя компилятор не вызывает ошибок, фильтрация не работает должным образом. Если я напишу что-то, данные исчезнут, если я стираю, он вернулся. После попытки и попытки я понял, что если бы я начал набирать «myNamespace.myChannel» (Unico.Canal), данные остались, но не фильтруются. Странное поведение. Я подозреваю, что поставил что-то в неправильном месте.Фильтр CollectionViewSource

enter image description hereenter image description hereenter image description here

(для лучшего понимания я перевел код, канал = канал)

Вот схема моего кода:

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; 

      } 


     } 
    } 

Данные связаны в XAML с:

ItemsSource="{Binding view}" 

EDIT: Я думаю, что знаю, где проблема: я не задаю свойство фильтровать. Я имею в виду, что вы видите в ComboBox свойство channelNameclass Channel, перечисленное в myListChannels. Когда я устанавливаю фильтр, не должен ли я знать, что я фильтрую? Как я мог написать это? Большое спасибо.

ответ

1

Да, ваше предположение верно.

Я предполагаю, что с вашими переводами,

public ObservableCollection<Channel> myListChannels; 

фактически

public ObservableCollection<Canal> miListaDeCanales; 

с классом Canal в пространстве имен Unico

Update:

В йо ur попробуйте использовать свойство, которое отображается в ComboBox, чем ToString() на object (o), если вы не переопределили ToString() от System.Object.

попытка переключения

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

в

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

^^, который должен устранить проблему.

У вас есть DataTemplate для ComboBox.ItemTemplate в xaml. Это объяснит, почему вы видите действительное значение в ComboBox, иначе все ComboBoxItem также будут отображаться как Unico.Canal

+0

Вы мой герой. – Sturm

Смежные вопросы