How I can set programmatically Binding "Header" property of newTableList.Items elements to TableModel.TABLE_NAME ?
foreach (SchemaModel schema in connection.schemas)
{ 
 TreeViewItem newSchema = new TreeViewItem() 
 { 
     Header = schema.SCHEMA_NAME.ToString() 
 };
 Binding newTableBinding = new Binding();     
 newTableBinding.Source = schema.tables;
 TreeViewItem newTableList = new TreeViewItem()
 {
      Header = "Tables",
 };
 BindingOperations.SetBinding( newTableList, TreeViewItem.ItemsSourceProperty, newTableBinding);
newSchema.Items.Add(newTableList);
newTVI.Items.Add(newSchema);
}
My old, very slow code looks like that:
foreach (TableModel table in schema.tables)
{
   newTableList.Items.Add(new TreeViewItem()
   {
       Header = table.TABLE_NAME.ToString()
   });
}
OLD TOPIC ( FOR BETTER VIEW )
I try to build custom TreeView and change my "VERY SLOW METHOD" with fastest with Binding to list of custom objects.
I have SchemaModel which contains
List<TableModel> tables
and every TableModel have
string TABLE_NAME.
My previous very slow method Was :
/*  VERY SLOW METHOD !!! */
//foreach (TableModel table in schema.tables)
//{
//    newTableList.Items.Add(new TreeViewItem()
//    {
//        Header = table.TABLE_NAME.ToString()
//    });
//}
Creating each time TreeViewItem is slowing my UI which I cannot repair with multitasking.
I decided to programmatically Bind to list of TableModels like that :
Binding newTableBinding = new Binding();
newTableBinding.Source = schema.tables;
TreeViewItem newTableList = new TreeViewItem()
{
    Header = "Tables",
    // ItemsSource = schema.tables // also works 
};
BindingOperations.SetBinding( newTableList, TreeViewItem.ItemsSourceProperty, newTableBinding);
How Can i Bind the Header property to "TABLE_NAME" for Items based on schema.tables list?
My full code
Code:
foreach (ConnectionModel connection in aliases)
{
    TreeViewItem newTVI = new TreeViewItem() { Header = connection.alias.ToString() };
    foreach (SchemaModel schema in connection.schemas)
    {
        TreeViewItem newSchema = new TreeViewItem() { Header = schema.SCHEMA_NAME.ToString() };
        Binding newTableBinding = new Binding();
        newTableBinding.Source = schema.tables;
        // newTableBinding.Path = new PropertyPath("TABLE_NAME");
        TreeViewItem newTableList = new TreeViewItem()
        {
            Header = "Tables",
            // ItemsSource = schema.tables
        };
        BindingOperations.SetBinding( newTableList, TreeViewItem.ItemsSourceProperty, newTableBinding);
       TreeViewItem newIndexList = new TreeViewItem() { Header = "Indexes" };
      /*  VERY SLOW METHOD !!! */
       //foreach (TableModel table in schema.tables)
       //{
       //    newTableList.Items.Add(new TreeViewItem()
       //    {
       //        Header = table.TABLE_NAME.ToString()
       //    });
       //}
       newSchema.Items.Add(newTableList);
       newSchema.Items.Add(newIndexList);
       newTVI.Items.Add(newSchema);
   }
   tmpAliasTree.Items.Add(newTVI);
}
tmpAliasTree is my TreeView.
My ConnectionModel
[Serializable()]
public class ConnectionModel
{
    private int    _id;
    private string _dsn;
    private string _alias   ;
    private string _host    ;
    private string _port    ;
    private string _database;
    private string _username;
    private string _password;
    public List<SchemaModel> schemas = new List<SchemaModel>();
  }
My SchemaModel :
[Serializable()]
public class SchemaModel
{
    [System.Xml.Serialization.XmlElement("SCHEMA_NAME")]
    public string SCHEMA_NAME { get; set; } = "";
    [XmlArray("tables"), XmlArrayItem("TableModel", typeof(TableModel), ElementName = "TableModel")]
    public List<TableModel> tables = new List<TableModel>();
}
My TableModel
[Serializable()]
public class TableModel
{
    [System.Xml.Serialization.XmlElement("TABLE_CAT")]
    public string TABLE_CAT     { get; set; }  = "";
    [System.Xml.Serialization.XmlElement("TABLE_SCHEM")]
    public string TABLE_SCHEM   { get; set; }  = "";
    [System.Xml.Serialization.XmlElement("TABLE_NAME")]
    public string TABLE_NAME    { get; set; }  = "";
    [System.Xml.Serialization.XmlElement("TABLE_TYPE")]
    public string TABLE_TYPE    { get; set; }  = "";
    [System.Xml.Serialization.XmlElement("REMARKS")]
    public string REMARKS       { get; set; } = "";
}
Thank You for any advise.