您的位置:首页 > 其它

WPF新手之如何将数据绑定到TreeView

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

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

举例如下:

[c-sharp] view plain copy

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来实现绑定。这样可以与一个具体的对象进行绑定:

[xhtml] view plain copy

<TreeView x:Name="ProfileTreeView" ItemsSource="{Binding }">

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

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

ProfileTreeView.DataContext = _profiles;

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

<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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: