WPF新手之如何將數據綁定到TreeView

看過許多例子,全是綁定到類的,沒人說如何綁定到某個對象,恰恰我這個絕對的新手就是要綁定到一個對象,只能本身摸索了:html

 

首先要將數據綁定到容器,有如下幾個默認條件:
①元數據必須包裝在List或者ObservableCollection中,後者具備動態更新的功能。即,若是在程序中更改了ObservableCollection的值,與之綁定的控件會自動獲得更新。
②待綁定的元數據能夠是基本類型,也能夠是複雜對象,這樣就能夠實際像TreeView這樣的嵌套顯示,但對象的每一個成員都必須是基本類型,或者是ObservableCollection。這一點我花了一天的時間才本身琢磨出來。
③類中的全部成員變量所有要以get、set設置其訪問屬性。又花了我一天。app

舉例以下:oop

 

[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來實現綁定。這樣能夠與一個具體的對象進行綁定:this

 

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

 

(由於這裏我是在TreeView上直接設置的,還不是像不少人在TreeViewItem上設置,所以_profiles中數據會直接在頂層顯示)spa

接着在C#代碼中對它進行設置:.net

  1. ProfileTreeView.DataContext = _profiles;  

Profile是一個複雜對象,要在TreeView中顯示,必需要設置其模板。並且從頂層算起是一種嵌套,因此要用HierarchicalDataTemplate。其中DataType表示接受類型Type的數據,Binding中的Path表示用的是Type中的哪一個成員。
最內層的模板應該用DataTemplate。xml

  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>  
相關文章
相關標籤/搜索