wpf綁定TreeView,貌似比winForm可能要麻煩一些,不過仔細分析一下,還是很好解決的,最近做了一個項目,正好寫了一下,下面把代碼貼出來和大家分享一下
先看一個簡單的綁定

//代碼綁定TreeView2 private void BindTreeView2() { TreeViewItem item1 = new TreeViewItem() { Header = "節點一" }; TreeViewItem item11 = new TreeViewItem() { Header = "節點1-1" }; item11.Items.Add("aaaa"); item11.Items.Add("bbbb"); item11.Items.Add("cccc"); item11.Items.Add("dddd"); item1.Items.Add(item11); item1.Items.Add("cccc"); item1.Items.Add("dddd"); TreeViewItem item2 = new TreeViewItem() { Header = "節點二" }; item2.Items.Add("aaaa"); item2.Items.Add("bbbb"); item2.Items.Add("cccc"); item2.Items.Add("dddd"); treeView2.Items.Add(item1); treeView2.Items.Add(item2); } private void treeView2_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) { string dd = treeView2.SelectedItem as string; MessageBox.Show(dd); }
然后在看看動態綁定
首先、需要創建一個節點類,包括節點名稱,圖片,內容等,另外為了可以增加子節點,在加一個泛型IList,類型就是節點類本身

///
<summary>
/// 節點類
/// </summary>
internal class PropertyNodeItem
{
public string Icon { get; set; }
public string EditIcon { get; set; }
public string DisplayName { get; set; }
public string Name { get; set; }
public int id { get; set; }
public int parentId{ get; set;}
public bool IsExpanded { get; set; }
public List<PropertyNodeItem> Children { get; set; }
public PropertyNodeItem()
{
Children = new List<PropertyNodeItem>();
}
}
/// 節點類
/// </summary>
internal class PropertyNodeItem
{
public string Icon { get; set; }
public string EditIcon { get; set; }
public string DisplayName { get; set; }
public string Name { get; set; }
public int id { get; set; }
public int parentId{ get; set;}
public bool IsExpanded { get; set; }
public List<PropertyNodeItem> Children { get; set; }
public PropertyNodeItem()
{
Children = new List<PropertyNodeItem>();
}
}
然后從數據庫中讀取根節點綁定到treeView中

WebDictClassServices.WebDictClass webDict =
new WebDictClass();
// 根節點添加到treeVIew中
private void loadTree()
{
tvProperties.Items.Clear(); // 加載根節點前先清除Treeview控件項
List<PropertyNodeItem> itemList = new List<PropertyNodeItem>();
DataTable dt=webDict.GetArticles();
DataView dv = dt.DefaultView;
dv.RowFilter = " ClassType='3' and ParentId=0 ";
PropertyNodeItem node = new PropertyNodeItem()
{
DisplayName = dv[ 0].Row[ " title "].ToString(),
Name = dv[ 0].Row[ " title "].ToString(),
id=Convert.ToInt32(dv[ 0].Row[ " id "].ToString()),
parentId=Convert.ToInt32(dv[ 0].Row[ " ParentId "].ToString()),
IsExpanded= true
};
int id =Convert.ToInt32(dv[ 0][ " id "].ToString());
int pid = Convert.ToInt32(dv[ 0][ " ParentId "].ToString());
ForeachPropertyNode(node, id);
itemList.Add(node);
this.tvProperties.ItemsSource = itemList;
}
// 根節點添加到treeVIew中
private void loadTree()
{
tvProperties.Items.Clear(); // 加載根節點前先清除Treeview控件項
List<PropertyNodeItem> itemList = new List<PropertyNodeItem>();
DataTable dt=webDict.GetArticles();
DataView dv = dt.DefaultView;
dv.RowFilter = " ClassType='3' and ParentId=0 ";
PropertyNodeItem node = new PropertyNodeItem()
{
DisplayName = dv[ 0].Row[ " title "].ToString(),
Name = dv[ 0].Row[ " title "].ToString(),
id=Convert.ToInt32(dv[ 0].Row[ " id "].ToString()),
parentId=Convert.ToInt32(dv[ 0].Row[ " ParentId "].ToString()),
IsExpanded= true
};
int id =Convert.ToInt32(dv[ 0][ " id "].ToString());
int pid = Convert.ToInt32(dv[ 0][ " ParentId "].ToString());
ForeachPropertyNode(node, id);
itemList.Add(node);
this.tvProperties.ItemsSource = itemList;
}
然后,在 ForeachPropertyNode方法中,實現了無限極節點

//
無限接循環子節點添加到根節點下面
private void ForeachPropertyNode(PropertyNodeItem node, int pid)
{
DataTable dtDict = webDict.GetArticles();
DataView dvDict = dtDict.DefaultView;
dvDict.RowFilter = " ClassType='3' and ParentId= " + pid;
if (dvDict.Count > 0)
{
foreach (DataRowView view in dvDict)
{
int id = Convert.ToInt32(view[ " id "].ToString());
string name = view[ " title "].ToString();
int parentId = Convert.ToInt32(view[ " ParentId "].ToString());
PropertyNodeItem childNodeItem = new PropertyNodeItem()
{
DisplayName = name,
Name = name,
id=id,
parentId=parentId,
IsExpanded= false
};
ForeachPropertyNode(childNodeItem, id);
node.Children.Add(childNodeItem);
}
}
}
private void ForeachPropertyNode(PropertyNodeItem node, int pid)
{
DataTable dtDict = webDict.GetArticles();
DataView dvDict = dtDict.DefaultView;
dvDict.RowFilter = " ClassType='3' and ParentId= " + pid;
if (dvDict.Count > 0)
{
foreach (DataRowView view in dvDict)
{
int id = Convert.ToInt32(view[ " id "].ToString());
string name = view[ " title "].ToString();
int parentId = Convert.ToInt32(view[ " ParentId "].ToString());
PropertyNodeItem childNodeItem = new PropertyNodeItem()
{
DisplayName = name,
Name = name,
id=id,
parentId=parentId,
IsExpanded= false
};
ForeachPropertyNode(childNodeItem, id);
node.Children.Add(childNodeItem);
}
}
}
如果我們想觸發點擊節點事件

//
選中節點事件
private void tvProperties_SelectedItemChanged( object sender, RoutedPropertyChangedEventArgs< object> e)
{
PropertyNodeItem item = this.tvProperties.SelectedItem as PropertyNodeItem;
string nodeText= item.Name;
// MessageBox.Show(nodeText);
}
private void tvProperties_SelectedItemChanged( object sender, RoutedPropertyChangedEventArgs< object> e)
{
PropertyNodeItem item = this.tvProperties.SelectedItem as PropertyNodeItem;
string nodeText= item.Name;
// MessageBox.Show(nodeText);
}
前台的xaml文件
<
TreeView
Height
="264"
x:Name
="tvProperties"
Width
="220"
SelectedItemChanged
="tvProperties_SelectedItemChanged"
>
< TreeView.ItemContainerStyle >
< Style TargetType =" {x:Type TreeViewItem} " >
< Setter Property ="IsExpanded" Value =" {Binding IsExpanded} " ></ Setter >
</ Style >
</ TreeView.ItemContainerStyle >
< TreeView.ItemTemplate >
< HierarchicalDataTemplate ItemsSource =" {Binding Path=Children} " >
< StackPanel Orientation ="Horizontal" >
< Image VerticalAlignment ="Center" Source =" {Binding Icon} " Width ="16" Height ="16" Margin ="0,0,2,2" ></ Image >
< TextBlock VerticalAlignment ="Center" Name ="nodeName" Text =" {Binding DisplayName} " ></ TextBlock >
< Image VerticalAlignment ="Center" Source =" {Binding EditIcon} " Margin ="2,0,0,0" ></ Image >
< StackPanel.ToolTip >
< TextBlock VerticalAlignment ="Center" Text =" {Binding Name} " TextWrapping ="Wrap" MaxWidth ="200" ></ TextBlock >
</ StackPanel.ToolTip >
</ StackPanel >
</ HierarchicalDataTemplate >
</ TreeView.ItemTemplate >
</ TreeView >
< TreeView.ItemContainerStyle >
< Style TargetType =" {x:Type TreeViewItem} " >
< Setter Property ="IsExpanded" Value =" {Binding IsExpanded} " ></ Setter >
</ Style >
</ TreeView.ItemContainerStyle >
< TreeView.ItemTemplate >
< HierarchicalDataTemplate ItemsSource =" {Binding Path=Children} " >
< StackPanel Orientation ="Horizontal" >
< Image VerticalAlignment ="Center" Source =" {Binding Icon} " Width ="16" Height ="16" Margin ="0,0,2,2" ></ Image >
< TextBlock VerticalAlignment ="Center" Name ="nodeName" Text =" {Binding DisplayName} " ></ TextBlock >
< Image VerticalAlignment ="Center" Source =" {Binding EditIcon} " Margin ="2,0,0,0" ></ Image >
< StackPanel.ToolTip >
< TextBlock VerticalAlignment ="Center" Text =" {Binding Name} " TextWrapping ="Wrap" MaxWidth ="200" ></ TextBlock >
</ StackPanel.ToolTip >
</ StackPanel >
</ HierarchicalDataTemplate >
</ TreeView.ItemTemplate >
</ TreeView >
可以發現,我們綁定的節點是類型的,到時候都可以轉化過去,從而取得相關的值