zoukankan      html  css  js  c++  java
  • WPF新手之如何将数据绑定到TreeView

    看过许多例子,全是绑定到类的,没人说如何绑定到某个对象,偏偏我这个绝对的新手就是要绑定到一个对象,只能自己摸索了:

    首先要将数据绑定到容器,有以下几个默认条件:
    ①元数据必须包装在List或者ObservableCollection中,后者具有动态更新的功能。即,如果在程序中更改了ObservableCollection的值,与之绑定的控件会自动得到更新。
    ②待绑定的元数据可以是基本类型,也可以是复杂对象,这样就可以实际像TreeView这样的嵌套显示,但对象的每个成员都必须是基本类型,或者是ObservableCollection。这一点我花了一天的时间才自己琢磨出来。
    ③类中的所有成员变量全部要以get、set设置其访问属性。又花了我一天。

    举例如下:

    [c-sharp] view plain copy
    1. public class IPConfig  
    2.     {  
    3.         public IPAddress IP { get; private set; }  
    4.         public bool IPUseDHCP { get; private set; }  
    5.     //...  
    6.         public IPConfig()  
    7.         {  
    8.             this.IP = IPAddress.None;  
    9.             this.IPUseDHCP = false;  
    10.         }  
    11.         public IPConfig(string IPstr):this()  
    12.         {  
    13.             try  
    14.             {  
    15.                 this.IP = IPAddress.Parse(IPstr);  
    16.             }  
    17.             catch (Exception)  
    18.             { }  
    19.         }  
    20.     }  
    21. public class Profile  
    22.     {  
    23.     public string Name { get; private set; }  
    24.     public ObservableCollection<IPConfig> IPC { get; private set; }  
    25.         public Profile() {this.IPC = new ObservableCollection<IPConfig>();}  
    26.         public Profile( string name )  
    27.         {  
    28.             this.Name = name;  
    29.             this.IPC = new ObservableCollection<IPConfig>();  
    30.         }  
    31.         public Profile(string name, IPConfig ipc)  
    32.         {  
    33.             this.Name = name;  
    34.             this.IPC = new ObservableCollection<IPConfig>();  
    35.             this.IPC.Add(ipc);  
    36.         }  
    37. }  
    38. public ObservableCollection<Profile> _profiles = new ObservableCollection<Profile>();  

    对数据源只要提供{Binding},然后在程序中设置DataContext来实现绑定。这样可以与一个具体的对象进行绑定:

    [xhtml] view plain copy
    1. <TreeView x:Name="ProfileTreeView" ItemsSource="{Binding }">  

    (因为这里我是在TreeView上直接设置的,还不是像很多人在TreeViewItem上设置,因此_profiles中数据会直接在顶层显示)

    接着在C#代码中对它进行设置:

    1. ProfileTreeView.DataContext = _profiles;  

    Profile是一个复杂对象,要在TreeView中显示,必须要设置其模板。而且从顶层算起是一种嵌套,所以要用HierarchicalDataTemplate。其中DataType表示接受类型Type的数据,Binding中的Path表示用的是Type中的哪个成员。
    最内层的模板应该用DataTemplate。

    1. <TreeView.ItemTemplate>  
    2.                     <!--模板-->  
    3.                     <HierarchicalDataTemplate DataType="{x:Type local:Profile}"  
    4.                                   ItemsSource="{Binding Path=IPC}">  
    5.                         <TextBlock Text="{Binding Path=Name}" />  
    6.                     </HierarchicalDataTemplate>  
    7.                     <DataTemplate DataType="{x:Type local:IPConfig}">  
    8.                         <Grid>  
    9.                             <Grid.Resources>  
    10.                                 <local:BoolConverter x:Key="BoolConverter"/>  
    11.                                 <Style x:Key="NameStyle" TargetType="{x:Type TextBlock}">  
    12.                                     <Setter Property="Background" Value="PapayaWhip"/>  
    13.                                     <Setter Property="Margin" Value="18,2,6,2"/>  
    14.                                     <Setter Property="HorizontalAlignment" Value="Right"/>  
    15.                                 </Style>  
    16.                                 <Style x:Key="PropStyle" TargetType="{x:Type TextBlock}">  
    17.                                     <Setter Property="Background" Value="WhiteSmoke"/>  
    18.                                 </Style>  
    19.                             </Grid.Resources>  
    20.                             <Grid.RowDefinitions>  
    21.                                 <RowDefinition></RowDefinition>  
    22.                                 <RowDefinition></RowDefinition>  
    23.                                 <RowDefinition></RowDefinition>  
    24.                                 <RowDefinition></RowDefinition>  
    25.                             </Grid.RowDefinitions>  
    26.                             <Grid.ColumnDefinitions>  
    27.                                 <ColumnDefinition></ColumnDefinition>  
    28.                                 <ColumnDefinition></ColumnDefinition>  
    29.                                 <ColumnDefinition></ColumnDefinition>  
    30.                                 <ColumnDefinition></ColumnDefinition>  
    31.                             </Grid.ColumnDefinitions>  
    32.                             <TextBlock Grid.Row="0" Grid.Column="0" Style="{StaticResource NameStyle}" mce_Style="{StaticResource NameStyle}">自  
    33. 动IP:</TextBlock>  
    34.                             <TextBlock Grid.Row="0" Grid.Column="1" Style="{StaticResource PropStyle}" mce_Style="{StaticResource PropStyle}"  
    35.                                        Text="{Binding Path=IPUseDHCP, Converter={StaticResource   
    36. BoolConverter}}" />  
    37.             <!--。。。-->  
    38.             </Grid>  
    39.                     </DataTemplate>  
    40.                                 </TreeView.ItemTemplate>  
  • 相关阅读:
    大型网站架构系列——分布式消息队列
    docker 搭建lnmp环境以及docker常用命令
    编译PHP扩展amqp & php消息队列 rabbitmq
    python @staticmethod和@classmethod的作用
    Sqlalchemy model 文件自动生成
    正则表达式–零宽断言-赵兴壮
    php 编码规范
    MySQL8.0 InnoDB并行执行
    MySQL8.0 新特性 Hash Join
    MySQL8.0 redo日志系统优化
  • 原文地址:https://www.cnblogs.com/sjqq/p/6951508.html
Copyright © 2011-2022 走看看