wpf綁定TreeView,貌似比winForm可能要麻煩一些,不過仔細(xì)分析一下,還是很好解決的,最近做了一個項目,正好寫了一下,下面把代碼貼出來和大家分享一下
先看一個簡單的綁定
//代碼綁定TreeView2 private void BindTreeView2() { TreeViewItem item1 = new TreeViewItem() { Header = "節(jié)點一" }; TreeViewItem item11 = new TreeViewItem() { Header = "節(jié)點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 = "節(jié)點二" }; 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); }
然后在看看動態(tài)綁定
首先、需要創(chuàng)建一個節(jié)點類,包括節(jié)點名稱,圖片,內(nèi)容等,另外為了可以增加子節(jié)點,在加一個泛型IList,類型就是節(jié)點類本身
/// <summary>
/// 節(jié)點類
/// </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>();
}
}
然后從數(shù)據(jù)庫中讀取根節(jié)點綁定到treeView中
WebDictClassServices.WebDictClass webDict = new WebDictClass();
//根節(jié)點添加到treeVIew中
private void loadTree()
{
tvProperties.Items.Clear();//加載根節(jié)點前先清除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方法中,實現(xiàn)了無限極節(jié)點
//無限接循環(huán)子節(jié)點添加到根節(jié)點下面
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);
}
}
}
如果我們想觸發(fā)點擊節(jié)點事件
//選中節(jié)點事件
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>
可以發(fā)現(xiàn),我們綁定的節(jié)點是類型的,到時候都可以轉(zhuǎn)化過去,從而取得相關(guān)的值