您的位置:首页 > 其它

wpf之TreeView绑定

2014-04-30 22:23 183 查看
 wpf绑定TreeView,貌似比winForm可能要麻烦一些,不过仔细分析一下,还是很好解决的,最近做了一个项目,正好写了一下,下面把代码贴出来和大家分享一下

首先、需要创建一个节点类,包括节点名称,图片,内容等,另外为了可以增加子节点,在加一个泛型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>();
}
}
然后从数据库中读取根节点绑定到treeView中

//根节点添加到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 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>
可以发现,我们绑定的节点是类型的,到时候都可以转化过去,从而取得相关的值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: