Фильтрация CollectionViewSource

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

введите здесь описание изображениявведите здесь описание изображениявведите здесь описание изображения

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

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

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}" 

РЕДАКТИРОВАТЬ: я думаю, что знаю, в чем проблема: я не указываю свойство для фильтрации. Я имею в виду, что вы видите в ComboBox свойство channelName из class Channel, перечисленных в myListChannels. Когда я устанавливаю фильтр, разве я не должен сообщать, что я фильтрую? Как я мог это написать? Спасибо большое.


person Sturm    schedule 29.05.2013    source источник


Ответы (1)


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

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

public ObservableCollection<Channel> myListChannels;

на самом деле

public ObservableCollection<Canal> miListaDeCanales;

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

Обновление:

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

попробуй переключить

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

to

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

^^ это должно решить вашу проблему.

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

person Viv    schedule 29.05.2013