Wpf學習(五) 數據綁定Binding【小達原創】
程序的本質是數據+算法,咱們這一篇就看看wpf程序中的數據是怎樣展現在前臺的。
1、咱們新建一個Wpf項目。為該項目增加【data】文件夾,在該文件夾中添加【Person】類,如下圖:
2、打開【Person】類,鍵入以下代碼:
我們現在有了一個普通的實體類,但是WPF是數據驅動界面的一項技術。(界面的數據源變化後,界面的顯示會跟著變化,不需要手動刷新。)這就要求我們‘’監聽“”我們的數據源。我們下面看看應該怎麽做。
3、在項目中加入【BaseModel】類,在【BaseModel】類中實現監聽的方法,以後所有的類都繼承自【BaseModel】類。這樣所有的類都具有了監聽數據源變化的功能:
咱們解釋一下【BaseModel】類,這個類實現了一個位於System.ComponentModel命名空間下的接口INotifyPropertyChanged;這個接口很簡單,裏面只有一個事件:
event PropertyChangedEventHandler PropertyChanged;
咱們要在【BaseModel】類中去調用這個事件的已經註冊的方法:
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
這樣一來【BaseModel】類中的方法RaisePropertyChanged(string propertyName)就具備了監聽數據實體屬性的功能。
4、改造【Person】 類,讓每個屬性賦值的時候都監聽一下有沒有變化:
5、打開MainWindow.xaml.cs文件,聲明並賦值一個數據源:
這裏解釋一下ObservableCollection<>。【Person】類繼承了【BaseModel】類,所以【Person】類可以監聽自己的屬性,但是那麽作為一個數據集合如果數據集合的成員變了是不是也要監聽呢?
答案是肯定的所以這裏用了ObservableCollection<>,而不是
擴展:類型ObservableCollection<>實現了INotifyCollectionChanged接口。這個接口裏面也是只有一個事件。
道理跟監聽屬性差不多,感興趣的童鞋可以自己研究下,在這不做過多的解釋了。
6、將我們建好的數據源賦值給MainWindow窗體的上下文數據:
this.DataContext = m_PersonList;
7、在前臺我們新建一個ListBox,然後給他寫一個樣式:
<Window x:Class="WpfApplication4.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Style x:Key="m_ViewBoxItem" TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" FontSize="20" Margin="10"></TextBlock>
<TextBlock Text="{Binding Age}" FontSize="20" Margin="10"></TextBlock>
<TextBlock Text="{Binding Sex}" FontSize="20" Margin="10"></TextBlock>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="m_ListBox" TargetType="{x:Type ListBox}">
<Setter Property="ItemContainerStyle" Value="{StaticResource m_ViewBoxItem}"></Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBox}">
<Grid Background="Transparent">
<ItemsPresenter SnapsToDevicePixels="{Binding SnapsToDevicePixels}"></ItemsPresenter>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<ListBox Style="{StaticResource m_ListBox}" ItemsSource="{Binding}"></ListBox>
</Grid>
</Window>
運行:
我們看到數據成功綁定到了前臺。
擴展:大家可以再後臺去動態的改變數據集合的成員或者數據源中的某一個成員中的屬性,看看是不是數據不需要刷新就會界面更新。
Wpf學習(五) 數據綁定Binding【小達原創】