1. 如果 TreeView 的 Items 绑定了一个源集合, 那麼对集合增减, wpf 会自动处理, 更新显示(如果集合实现了INotifyCollectionChanged 介面的话).
例如 TreeView 的 Items 绑定了一个 ObservableCollection<string> 的集合, 则 对这个集合使用 Add/Remove 等方法时, wpf 会自动更新 TreeView 的显示.
2. 如果 TreeView 没有绑定集合, 则 它的 Items 可以添加任何元素. 所添加的元素自动以 TreeViewItem 作为容器来承载, 根据相应的 DataTemplate 或者默认的方式,显示到 TreeView 中.
eg. 下面是一个没有任何 Item 的 TreeView, 你可以在代码中动态增减:
<TreeView x:Name="myTV">
--------------
先增加一些节点:
myTV.Items.Add("I'm the rootNode") // 可以是任何类型, 这里是 string
DockPanel dp= new DockPanel()
TextBlock tb = new TextBlock()
tb.Text = "I'm the child node"
tb.VerticalAlignment = VerticalAlignment.Center
Image img = new Image()
img.Stretch= Stretch.None
img.Source= new BitmapImage(new Uri(@"C:\wpf.bmp", UriKind.Absolute))
dp.Children.Add(img)
dp.Children.Add(tb)
(myTV.ItemContainerGenerator.ContainerFromIndex(0) as TreeViewItem).Items.Add(dp)
--------------------
然后修改这些节点:
TextBox t = new TextBox()
t.Text = myTV.Items[0] as string
myTV.Items[0] = t
((((myTV.ItemContainerGenerator.ContainerFromIndex(0) as TreeViewItem).Items[0]) as DockPanel).Children[1] as TextBlock).Text = "an image sits on my left side"
表中创建三个字段就可以了(ID,Name,ParentID),然后定义一个对应节点的类,比如:public class TypeNode
{
public string ID{getset}
public string Name{getset}
public TypeNode Parent{getset}
public ObservableCollection<TypeNode>Children{getset}
public bool IsSelected{getset}
}
添加构造节点的方法,根据ID来确定上下级和加载子节点,代码就不列举了;然后实现一下INotifyPropertyChanged接口就差不多了。接着定义几个样式:
<Style x:Key="TypeTreeStyle" TargetType="TreeView">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TreeView">
<ScrollViewer Padding="4" Focusable="False" CanContentScroll="False">
<ItemsPresenter/>
</ScrollViewer>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="TypeNode" TargetType="TreeViewItem">
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
<Setter Property="FontWeight" Value="Normal"/>
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="FontWeight" Value="Bold"/>
</Trigger>
</Style.Triggers>
</Style>
<HierarchicalDataTemplate x:Key="TypeTreeGroup" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding TypeName}" FontSize="13"/>
</HierarchicalDataTemplate>
在ViewModel或是后台代码中定义一个ObservableCollection<TypeNode>集合,名为TypeTree,在xaml中添加TreeView并绑定:
<TreeView ItemsSource="{Binding TypeTree}"
Style="{StaticResource TypeTreeStyle}"
ItemContainerStyle="{StaticResource TypeNode}"
ItemTemplate="{StaticResource TypeTreeGroup}"/>
根据节点的IsSelected属性来确定在哪个位置创建子节点,同时就得到了数据的ParentID,再加上创建时指定的ID和Name存入数据库就完工了。希望对你有帮助,还有疑问请追问或是Hi
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)