看過許多例子,全是綁定到類的,沒人說如何綁定到某個對象,恰恰我這個絕對的新手就是要綁定到一個對象,只能本身摸索了:html
首先要將數據綁定到容器,有如下幾個默認條件:
①元數據必須包裝在List或者ObservableCollection中,後者具備動態更新的功能。即,若是在程序中更改了ObservableCollection的值,與之綁定的控件會自動獲得更新。
②待綁定的元數據能夠是基本類型,也能夠是複雜對象,這樣就能夠實際像TreeView這樣的嵌套顯示,但對象的每一個成員都必須是基本類型,或者是ObservableCollection。這一點我花了一天的時間才本身琢磨出來。
③類中的全部成員變量所有要以get、set設置其訪問屬性。又花了我一天。app
舉例以下:oop
- public class IPConfig
- {
- public IPAddress IP { get; private set; }
- public bool IPUseDHCP { get; private set; }
-
- public IPConfig()
- {
- this.IP = IPAddress.None;
- this.IPUseDHCP = false;
- }
- public IPConfig(string IPstr):this()
- {
- try
- {
- this.IP = IPAddress.Parse(IPstr);
- }
- catch (Exception)
- { }
- }
- }
- public class Profile
- {
- public string Name { get; private set; }
- public ObservableCollection<IPConfig> IPC { get; private set; }
- public Profile() {this.IPC = new ObservableCollection<IPConfig>();}
- public Profile( string name )
- {
- this.Name = name;
- this.IPC = new ObservableCollection<IPConfig>();
- }
- public Profile(string name, IPConfig ipc)
- {
- this.Name = name;
- this.IPC = new ObservableCollection<IPConfig>();
- this.IPC.Add(ipc);
- }
- }
- public ObservableCollection<Profile> _profiles = new ObservableCollection<Profile>();
對數據源只要提供{Binding},而後在程序中設置DataContext來實現綁定。這樣能夠與一個具體的對象進行綁定:this
- <TreeView x:Name="ProfileTreeView" ItemsSource="{Binding }">
(由於這裏我是在TreeView上直接設置的,還不是像不少人在TreeViewItem上設置,所以_profiles中數據會直接在頂層顯示)spa
接着在C#代碼中對它進行設置:.net
- ProfileTreeView.DataContext = _profiles;
Profile是一個複雜對象,要在TreeView中顯示,必需要設置其模板。並且從頂層算起是一種嵌套,因此要用HierarchicalDataTemplate。其中DataType表示接受類型Type的數據,Binding中的Path表示用的是Type中的哪一個成員。
最內層的模板應該用DataTemplate。xml
- <TreeView.ItemTemplate>
-
- <HierarchicalDataTemplate DataType="{x:Type local:Profile}"
- ItemsSource="{Binding Path=IPC}">
- <TextBlock Text="{Binding Path=Name}" />
- </HierarchicalDataTemplate>
- <DataTemplate DataType="{x:Type local:IPConfig}">
- <Grid>
- <Grid.Resources>
- <local:BoolConverter x:Key="BoolConverter"/>
- <Style x:Key="NameStyle" TargetType="{x:Type TextBlock}">
- <Setter Property="Background" Value="PapayaWhip"/>
- <Setter Property="Margin" Value="18,2,6,2"/>
- <Setter Property="HorizontalAlignment" Value="Right"/>
- </Style>
- <Style x:Key="PropStyle" TargetType="{x:Type TextBlock}">
- <Setter Property="Background" Value="WhiteSmoke"/>
- </Style>
- </Grid.Resources>
- <Grid.RowDefinitions>
- <RowDefinition></RowDefinition>
- <RowDefinition></RowDefinition>
- <RowDefinition></RowDefinition>
- <RowDefinition></RowDefinition>
- </Grid.RowDefinitions>
- <Grid.ColumnDefinitions>
- <ColumnDefinition></ColumnDefinition>
- <ColumnDefinition></ColumnDefinition>
- <ColumnDefinition></ColumnDefinition>
- <ColumnDefinition></ColumnDefinition>
- </Grid.ColumnDefinitions>
- <TextBlock Grid.Row="0" Grid.Column="0" Style="{StaticResource NameStyle}" mce_Style="{StaticResource NameStyle}">自
- 動IP:</TextBlock>
- <TextBlock Grid.Row="0" Grid.Column="1" Style="{StaticResource PropStyle}" mce_Style="{StaticResource PropStyle}"
- Text="{Binding Path=IPUseDHCP, Converter={StaticResource
- BoolConverter}}" />
-
- </Grid>
- </DataTemplate>
- </TreeView.ItemTemplate>