【问题标题】:Filtering CollectionViewSource过滤 CollectionViewSource
【发布时间】:2013-05-29 14:43:29
【问题描述】:

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

【问题讨论】:

    标签: c# wpf data-binding filter collectionviewsource


    【解决方案1】:

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

    我假设你的翻译,

    public ObservableCollection<Channel> myListChannels;
    

    其实是

    public ObservableCollection<Canal> miListaDeCanales;
    

    在命名空间Unico 中使用类Canal

    更新:

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

    尝试切换

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

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

    ^^ 应该可以解决您的问题。

    您在 xaml 中是否有用于 ComboBox.ItemTemplateDataTemplate。这将解释为什么您会看到 ComboBox 中呈现的有效值,否则所有 ComboBoxItem 也将呈现为 Unico.Canal

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-07
      • 2020-06-24
      • 1970-01-01
      • 1970-01-01
      • 2011-04-19
      相关资源
      最近更新 更多