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>
首先要将数据绑定到容器,有以下几个默认条件:
①元数据必须包装在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>
相关文章推荐
- WPF新手之如何将数据绑定到TreeView
- WPF中的TreeView如何定义模版,并绑定数据
- 潜移默化学会WPF(难点控件treeview)--改造TreeView(CheckBox多选择版本),递归绑定数据
- WPF中Treeview绑定数据库数据
- WPF新手之将如何将一个成员变量或自定义类绑定到控件
- 关于TreeView绑定数据库的表数据如何,代码在前两篇博文中~~
- 如何为TreeView定义三层模板并实现数据绑定
- WPF:Hyperlink如何绑定数据
- WPF Treeview 无限分级绑定集合数据
- 关于如何递归给TreeView从数据库中循环绑定数据
- WPF TreeView 的数据绑定(分层)
- WPF数据绑定机制是如何实现
- TreeView如何与数据库二维表数据绑定
- WPF新手之如何自定义TreeView点击后的背景色
- WPF的TreeView数据绑定基础
- WPF 控件如何绑定资源中的数据
- WPF新手之如何自定义TreeView点击后的背景色
- wpf中如何得到数据绑定树节点的父节点
- C#里的treeview控件如何能绑定数据库里的数据
- WPF ListView 分组数据绑定 TreeView递归数据绑定