static void getTreeNode(TreeViewModel tv, List<string> list)
 {
     if (tv.Children == null || tv.Children.Count == 0)
     {
         if (tv.IsChecked.HasValue && tv.IsChecked.Value)
         {
             list.Add(tv.ID);
         }
     }
     else
     {
         foreach (TreeViewModel subtv in tv.Children)
         {
             getTreeNode(subtv, list);
         }
     }
 }
        public static List<string> GetTree(TreeViewModel tv)
        {
            List<string> selected = new List<string>();
            getTreeNode(tv, selected);
            //select = recursive method to check each tree view item for selection (if required)


            return selected;

            //***********************************************************
            //From your window capture selected your treeview control like:   TreeViewModel root = (TreeViewModel)TreeViewControl.Items[0];
            //                                                                List<string> selected = new List<string>(TreeViewModel.GetTree());
            //***********************************************************
        }
 public static void SetTree(TreeViewModel tv, List<string> IDList)
 {
     if (tv.Children == null || tv.Children.Count == 0)
     {
         tv.IsChecked = IDList.Contains(tv.ID);
     }
     else
     {
         foreach (TreeViewModel subTv in tv.Children)
         {
             bool CanSelect = subTv.IsCanSelect;
             subTv.IsCanSelect = tv.IsCanSelect;
             SetTree(subTv, IDList);
             subTv.IsCanSelect = CanSelect;
         }
     }
 }
        public  async static Task< List<TreeViewModel>> SetTree(string topLevelName, bool IsCanSelect)
        {
            List<TreeViewModel> treeView = new List<TreeViewModel>();
            TreeViewModel tv = new TreeViewModel(topLevelName, string.Empty, IsCanSelect);

            treeView.Add(tv);
            //Perform recursive method to build treeview 

            #region Test Data
            //Doing this below for this example, you should do it dynamically 
            //***************************************************
            slSecure.Web.SecureDBContext db;
            db = slSecure.DB.GetDB();

            var ERNameData = await db.LoadAsync<tblEngineRoomConfig>(db.GetTblEngineRoomConfigIncludeQuery());
            string sERName, sReadCardName, sControlID;
            foreach (var tempERNameData in ERNameData)
            {
                sERName = tempERNameData.ERName;
                TreeViewModel tr_sERName = new TreeViewModel(sERName, string.Empty, IsCanSelect);
                if ((sERName != "泰山機房B1-UPS室") && (sERName != "龍潭堵機房") && (sERName != "觀音山機房"))
                {
                    tv.Children.Add(tr_sERName);
                }

                foreach (var tempEntranceGuardData in tempERNameData.tblEntranceGuardConfig)
                {
                    foreach (var tempControllerConfigData in tempERNameData.tblControllerConfig)
                    {
                        if ((bool)tempControllerConfigData.IsEnable)
                        {
                            if (tempControllerConfigData.EntranceCode == tempEntranceGuardData.EntranceCode && (tempControllerConfigData.ControlType == 1 || tempControllerConfigData.ControlType == 2))
                            {
                                sControlID = tempControllerConfigData.ControlID;
                                sReadCardName = tempEntranceGuardData.Memo;

                                tr_sERName.Children.Add(new TreeViewModel(sReadCardName, tempControllerConfigData.ControlID, IsCanSelect));
                            }
                        }
                    }
                }
            }
            //***************************************************
            #endregion

            tv.Initialize();

            return treeView;
        }