【问题标题】:Filtering WPF TreeView without using Observable Collection在不使用可观察集合的情况下过滤 WPF TreeView
【发布时间】:2015-08-17 06:52:51
【问题描述】:

我正在从 MySQL 数据库中填写我的 TreeView。所以我没有为他们每个人上课。我使用HierarchicalDataTemplates 来构造TreeView,我有三个级别。我想过滤比较包含的TextBlock 的文本和用户输入的第一级。如何在不使用ObservableCollection 的情况下进行过滤? (我尝试使用ICollectionView,但失败了。)

Source = CollectionViewSource.GetDefaultView(FileTreeView.ItemsSource);

        this.Source.Filter = item =>
            {
                TreeViewItem vitem = item as TreeViewItem;

                if (vitem == null) return false;

                foreach (object items in vitem.Items)
                {
                    vitem.ApplyTemplate();

                    TreeViewItem firstlevel = vitem.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;

                    UIElement element = GetChildControl(firstlevel, "fem_title");

                    if (element != null)
                    {
                        TextBlock txt = (TextBlock)element;

                        return (txt.Text.Contains(title.SelectedValue.ToString()));
                    }
                }

                return false;

它抛出一个“NotSupportedException”。

我如何填充 TreeView:

private DataSet FillDataGrid()

    {

        try

        {

            MySqlConnection con = new MySqlConnection();

            con.ConnectionString = ConString;

            con.Open();



            MySqlDataAdapter femda = new MySqlDataAdapter("SELECT * FROM fem_table", con);

            MySqlDataAdapter versionda = new MySqlDataAdapter("SELECT * FROM version_table", con);

            MySqlDataAdapter fileda = new MySqlDataAdapter("SELECT * FROM file_table", con);



            DataSet ds = new DataSet();

            femda.Fill(ds, "fem_table");

            versionda.Fill(ds, "version_table");

            fileda.Fill(ds, "file_table");



            DataRelation dr = new DataRelation("DataRelationship_fem_version",

                ds.Tables["fem_table"].Columns["fem_guid"],

                ds.Tables["version_table"].Columns["fem_table_fem_guid"],

                true);



            DataRelation dr2 = new DataRelation("DataRelationship_version_file",

                ds.Tables["version_table"].Columns["version_id"],

                ds.Tables["file_table"].Columns["version_table_version_id"],

                true);



            dr.Nested = true;

            ds.Relations.Add(dr);

            ds.Relations.Add(dr2);

            return ds;



        }

        catch (Exception ex)

        { throw new Exception(ex.Message); }

    }



  private void Window_Loaded(object sender, RoutedEventArgs e)

    {

        this.FileTreeView.DataContext = FillDataGrid();

     }

【问题讨论】:

  • 请提供代码示例,并尝试使用ICollectionView
  • 我编辑提供了我如何尝试使用 ICollectionView 的代码
  • 谢谢,我认为这并不清楚。能否请您在TreeViewItem vitem = item as TreeViewItem; 行设置断点并告诉我项目的类型是什么?
  • 我认为过滤方法有问题。它给出错误“不支持指定的方法。”。所以它说“当前内容中不存在该项目”。

标签: c# wpf treeview hierarchicaldatatemplate


【解决方案1】:

过滤器适用于基础数据,而不适用于 UIElements。由于您不使用类来表示 TreeViewItem 并仅使用字符串填充它们,因此您的项目实际上是一个字符串。 这有效:

public partial class MainWindow : Window
{
    public List<string> Test = new List<string>() { "test", "someothertext" };
    public MainWindow()
    {
        InitializeComponent();
        treeView.ItemsSource = Test;
        var Source = CollectionViewSource.GetDefaultView(treeView.ItemsSource);
        string search_text = "test";
        Source.Filter = item =>
        {
            return item.ToString().Contains(search_text);
        };
    }
}

我不明白你是否使用多个文本框进行过滤,但如果你不这样做,你应该给一个文本框起个名字并使用它的文本

string search_text = txtbox.Text;

【讨论】:

  • 我只尝试了一个,如果它有效,我会尝试所有的文本框。我使用由 mysql 表构建的数据集填充树视图,因此 ItemsSource 是一个数据集。
  • 您能否提供有关如何填充树视图项的代码?
猜你喜欢
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
  • 2013-10-17
  • 2012-03-25
  • 2011-02-08
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多