过滤WPF TreeView而不使用Observable Collection



我正在从MySQL数据库填充我的TreeView。所以我没有给他们每个人上课。我使用HierarchicalDataTemplate s来构建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();
     }

Filter适用于底层数据,而不是ui元素。因为你没有使用类来表示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;

最新更新