WPF 提供了有关动态数据绑定的很多有效方法。
其中有一种就是通过ObservableCollection<T>将数据绑定到控件上去,
当ObservableCollection<T>集合中发生任意变化时,控件上动态绑定的数据也会随之发生变化。
或者可以通过自定义类实现ObservableCollection<T>类,也可以实现上面的方法:
<pre name="code" class="csharp">// 通过ObservableCollection<T>类实现绑定控件和基础数据源保持一致
// 当添加、删除、修改、刷新集合中的数据时都会出发CollectionChanged事件
// 该方法相对于绑定ItemSource效率更高
public class DisplayPerson: ObservableCollection<PersonInfo>
{
public Display()
{
// 将PersonInfo对象添加到DisplayPerson集合的最后
Add(new PersonInfo("FirstName","LastName"));
Add(new PersonInfo("Wang","Wei"));
}
}
/// 创建属性
// 包含firstname及lastName
public class PersonInfo
{
private string firstName;
private string lastName;
// firstName
public String FirstName
{
set{firstName=value;}
get{return firstName;}
}
// lastName
public String LastName
{
set{lastName=Value;}
get{return lastName;}
}
}
只需要将上面的DisplayPerson类名绑定到WPF控件上,例如ListBox:
这时就可以实现数据和控件关联起来。
下面是前台的xaml文件:
<Window x:Class="WpfObservableCollection.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="396.269" Width="735.448"
Loaded="WindowLoaded">
<Window.Resources >
<!--DisplayPerson 表示要绑定的数据源-->
<DataTemplate x:Key="MyTemplate" DataType="xType DisplayPerson">
<Grid >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width=" Auto"/>
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding Path=FirstName}" FontSize="18" Grid.Column="0"/>
<TextBlock Text="{Binding Path=LastName}" FontSize="20" Grid.Column="1"/>
<Button Content="Click it" FontSize="20" Grid.Column=" 2" />
</Grid>
</DataTemplate>
</Window.Resources>
<Grid>
<!--ItemsSource="{Binding Source={StaticResource NameListData}}"-->
<!--这里我们将数据模板ItemTemplate定义在Window Resource资源文件中--->
<ListBox x:Name="faxListBox" Margin="10,0,299,0" ItemTemplate="{StaticResource MyTemplate}" />
<Button x:Name="btnUserClick" Click="ButtonClick" Margin="469,10,119,311"/>
</Grid>
</Window>
上面就是将数据和控件关联在一起了,非常方便。
如果自己实现的话,需要使用到观察者模式,需要花很多的代码来实现。
下次会讲到如何通过观察者方式来实现控件和数据的关联。