过滤CollectionViewSource

时间:2013-05-29 14:43:30

标签: c# wpf data-binding filter collectionviewsource

我想使用过滤器对我的数据进行ComboBox绑定。为此,我创建了TextBoxComboBox。在后面的代码中,我读取一个文件并生成类Channel的对象,这些对象存储为ComboBox的项目。虽然编译器不会抛出任何错误,但过滤不能正常工作。如果我写了一些东西,数据就消失了,如果我擦掉了,那就回来了。尝试并尝试后我意识到,如果我开始输入“myNamespace.myChannel”(Unico.Canal),数据仍然存在,但不要过滤。确实是奇怪的行为。我怀疑我把东西放在错误的地方。

enter image description here enter image description here enter image description here

(为了更好地理解我已经翻译了代码,Canal =频道)

以下是我的代码方案:

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中看到的是myListChannels中列出的channelName的属性class Channel。当我设置过滤器时,我不应该知道我在过滤什么?我怎么写这个?非常感谢你。

1 个答案:

答案 0 :(得分:1)

是的,你的假设是正确的。

我假设你的翻译,

public ObservableCollection<Channel> myListChannels;

实际上是

public ObservableCollection<Canal> miListaDeCanales;

在命名空间Canal

中使用类Unico

<强>更新

在您的过滤器中尝试使用ComboBox中呈现的属性,而不是使用ToString()object)上的o,如果您没有覆盖ToString() 1}}来自System.Object

尝试切换

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

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

^^应该解决你的问题。

xaml中的DataTemplateComboBox.ItemTemplate吗?这将解释为什么您会看到ComboBox中呈现的有效值,否则所有ComboBoxItem的内容也会呈现为Unico.Canal