WPF中的TreeView

在wpf中實現treeview的功能,可能看到不少分享的都是簡單的綁定,僅此記錄本身完成的功能。node

前臺數據庫

                   <TreeView x:Name="chapterTree"  Grid.Column="0"  SelectedItemChanged="chapterTree_SelectedItemChanged" PreviewMouseRightButtonDown="chapterTree_PreviewMouseRightButtonDown" FontSize="14"  ItemsSource="{Binding Path=Nodes}" >
                       
                        <TreeView.ContextMenu>
                            <ContextMenu>
                                <MenuItem Header="保存" Name="btnAlterData" Click="btnAlterData_Click" />
                                <MenuItem Header="新增兄弟節點" Name="btnSaveData" Click="btnSaveData_Click"/>
                                <MenuItem Header="新增子節點" Name="btnSaveSonData" Click="btnSaveSonData_Click"/>
                                <MenuItem Header="刪除" Name="btnDdeleteData" Click="btnDdeleteData_Click"/>
                                <MenuItem Header="上移一位" Name="btnUp" Click="btnUp_Click"/>
                                <MenuItem Header="下移一位" Name="btnDown" Click="btnDown_Click"/>
                            </ContextMenu>
                        </TreeView.ContextMenu>
                        <TreeView.ItemTemplate>
                            <HierarchicalDataTemplate DataType="{x:Type c:OrderModel}" ItemsSource="{Binding Path=ChildNodes}">
                                <Label Content="{Binding Path=OrderName}"/>
                            </HierarchicalDataTemplate>
                        </TreeView.ItemTemplate>
                    </TreeView>

後臺this

        CommandModel cm;

        public Command()
        {
            InitializeComponent();
            cm = new CommandModel();
            chapterTree.ItemsSource = cm.Nodes;

        }

新建了CommandModel頁面用來綁定數據(從數據庫提取的數據,轉換成了list)spa

  

        public event PropertyChangedEventHandler PropertyChanged;
        private ObservableCollection<OrderModel> nodes = new ObservableCollection<OrderModel>();
        public ObservableCollection<OrderModel> Nodes
        {
            get { return nodes; }
            set
            {
                nodes = value;
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs("Nodes"));
            }
        }
        
        public CommandModel()
        {
            Initiate();
        }
        private void Initiate()
        {
            using (SQLiteConnection con = new SQLiteConnection(MainWindow.sb.ToString()))
            {
                DataTable table = new DataTable("MyTable");
                var reader = con.ExecuteReader("SELECT * FROM OrderData Order by OrderID");
                table.Load(reader);
                ObservableCollection<OrderModel> _nodes = new ObservableCollection<OrderModel>();
                _nodes = ConvertToList(table);

                //ShowTreeView();
                Nodes = getChildNodes(0, _nodes);

            }
        }

        private ObservableCollection<OrderModel> getChildNodes(long parentID, ObservableCollection<OrderModel> nodes)
        {
            List<OrderModel> a = new List<OrderModel>(nodes.Where(x => x.ParentID == parentID).ToList());
            ObservableCollection<OrderModel> mainNodes =new ObservableCollection<OrderModel>(a);
            List<OrderModel> b = new List<OrderModel>(nodes.Where(x => x.ParentID != parentID).ToList());
            ObservableCollection<OrderModel> otherNodes =new ObservableCollection<OrderModel>(b);
            foreach (OrderModel node in mainNodes)
                node.ChildNodes = getChildNodes(node.ID, otherNodes);
            return mainNodes;
        }




        #region    datatable轉list

        /// <summary>
        /// datatable轉list
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static ObservableCollection<OrderModel> ConvertToList(DataTable dt)
        {

            // 定義集合
            ObservableCollection<OrderModel> ts = new ObservableCollection<OrderModel>();

            // 得到此模型的類型
            Type type = typeof(OrderModel);
            //定義一個臨時變量
            string tempName = string.Empty;
            //遍歷DataTable中全部的數據行
            foreach (DataRow dr in dt.Rows)
            {
                OrderModel t = new OrderModel();
                // 得到此模型的公共屬性
                PropertyInfo[] propertys = t.GetType().GetProperties();
                //遍歷該對象的全部屬性
                foreach (PropertyInfo pi in propertys)
                {
                    tempName = pi.Name;//將屬性名稱賦值給臨時變量
                    //檢查DataTable是否包含此列(列名==對象的屬性名)  
                    if (dt.Columns.Contains(tempName))
                    {
                        // 判斷此屬性是否有Setter
                        if (!pi.CanWrite) continue;//該屬性不可寫,直接跳出
                        //取值
                        object value = dr[tempName];
                        //若是非空,則賦給對象的屬性
                        if (value != DBNull.Value)
                            pi.SetValue(t, value, null);
                    }
                }
                //對象添加到泛型集合中
                ts.Add(t);
            }

            return ts;
        }

        #endregion

model頁面的列中須要添加code

        public ObservableCollection<OrderModel> ChildNodes { get; set; }
        public OrderModel()
        {
            ChildNodes = new ObservableCollection<OrderModel>();
        }
相關文章
相關標籤/搜索