WPF入門教程系列二十——ListView示例(二)
第四步、WPF後臺邏輯代碼編寫
在後臺用Entity Framework 6.1的Code First方式獲取數據庫中的數據。同時,在“刷新”按鈕的方法中進行數據綁定。操作步驟如下:
1) 在“刷新”按鈕上使用鼠標右鍵,單擊,會彈出“屬性”窗口。如下圖。
2) 在“屬性”窗口中點擊右上角的閃電圖標按鈕,會出現事件窗口。在Click事件的文本框中進行雙擊,就會把按鈕的Click事件添加到後臺代碼中。如下圖。
3)具體代碼如下:
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); Database.SetInitializer<TestDBContext>(null); } private void btnRefresh_Click(object sender, RoutedEventArgs e) { GetData(); } TestDBContext db = new TestDBContext(); protected void GetData() { List<S_City> list = db.S_City.ToList<S_City>(); listView1.ItemsSource = list; } private void menuPrism_Click(object sender, RoutedEventArgs e) { WindowPrismDemo1 win = new WindowPrismDemo1(); win.Show(); } }
1) 對象實體類。代碼如下。
public class S_City { [Key] public long CityID{get;set;} public string CityName{get;set;} public string ZipCode{get;set;} public long ProvinceID{get;set;} public DateTime DateCreated{get;set;} public DateTime DateUpdated { get; set; } } public class TestDBContext : DbContext { public DbSet<S_City> S_City { get; set; } }
第五步、WPF前臺界面與後臺數據的Binding
寫完了上面的代碼之後,按F5,程序運行了起來,點“刷新”按鈕卻沒有任何數據顯示。這是由於後臺數據與前面界面沒有進行“綁定”,所以無法顯示數據,接下來跟著我做。
1)給GridViewColumn指明當前列對應於數據源的哪一項,可以通過DisplayMemberBinding屬性來實現。其中Path後面的值便是上一步中所寫的類S_City中指明屬性名稱。具體代碼如下。
<ListView Name="listView1" MinWidth="280" Grid.Row="1" > <ListView.View> <GridView x:Name="gridView1"> <GridViewColumn Header="CityID" DisplayMemberBinding="{Binding Path=CityID}"></GridViewColumn> <GridViewColumn Header="CityName" DisplayMemberBinding="{Binding Path=CityName}"></GridViewColumn> <GridViewColumn Header="ZipCode" DisplayMemberBinding="{Binding Path=ZipCode}"></GridViewColumn> <GridViewColumn Header="ProvinceID" DisplayMemberBinding="{Binding Path=ProvinceID}"></GridViewColumn> <GridViewColumn Header="DateCreated" DisplayMemberBinding="{Binding Path=DateCreated}"></GridViewColumn> <GridViewColumn Header="DateUpdated" DisplayMemberBinding="{Binding Path=DateUpdated}"></GridViewColumn> </GridView> </ListView.View> </ListView>
2)在Visual Studio 2013中按F5運行WPF程序,在程序運行起來之後,鼠標左鍵點擊“刷新”按鈕。你就可以看到如下圖這樣的畫面了。
註意:如果運行時報以下錯誤信息:
異常:已引發: "The model backing the ‘TestDBContext‘ context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269)." (System.InvalidOperationException)
引發了一個 System.InvalidOperationException: "The model backing the ‘TestDBContext‘ context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269)."
解決方法:
具體請查看我前面代碼中構造方法中以下語句。請註釋掉就會報錯,加上去就不會有問題。
Database.SetInitializer<TestDBContext>(null);
3)當我們使用鼠標左鍵點擊ListView中的記錄時,裏面的城市信息並沒有同步映射到下面的文本框中。這個功能應該如何實現呢?。
4)首先在WrapPanel元素中指明一個公共的上下文,可以通過增加屬性 DataContext="{Binding ElementName=listView1,Path=SelectedItem}來實現。
5)其次,對於需要顯示相應信息的文本框,需要通過綁定TextBox元素中的Text屬性實現,實現代碼如下:
<WrapPanel Grid.Row="2" Orientation="Horizontal" DataContext="{Binding ElementName=listView1,Path=SelectedItem}"> <StackPanel Orientation="Horizontal" Margin="5,2,5,2"> <TextBlock Name="textBlock_CityID" Text="CityID:" /> <TextBox Name="textBox_CityID" MinWidth="100" Text="{Binding CityID}" /> </StackPanel> <StackPanel Orientation="Horizontal" Margin="5,2,5,2"> <TextBlock Name="textBlock_CityName" Text="CityName:" /> <TextBox Name="textBox_CityName" MinWidth="100" Text="{Binding CityName}" /> </StackPanel> <StackPanel Orientation="Horizontal" Margin="5,2,5,2"> <TextBlock Name="textBlock_ZipCode" Text="ZipCode:" /> <TextBox Name="textBox_ZipCode" MinWidth="100" Text="{Binding ZipCode}" /> </StackPanel> <StackPanel Orientation="Horizontal" Margin="5,2,5,2"> <TextBlock Name="textBlock_ProvinceID" Text="ProvinceID:" /> <TextBox Name="textBox_ProvinceID" MinWidth="100" Text="{Binding ProvinceID}" /> </StackPanel> <StackPanel Orientation="Horizontal" Margin="5,2,5,2"> <TextBlock Name="textBlock_DateCreated" Text="DateCreated:" /> <TextBox Name="textBox_DateCreated" MinWidth="100" Text="{Binding DateCreated}" /> </StackPanel> <StackPanel Orientation="Horizontal" Margin="5,2,5,2"> <TextBlock Name="textBlock_DateUpdated" Text="DateUpdated:" /> <TextBox Name="textBox_DateUpdated" MinWidth="100" Text="{Binding DateUpdated}" /> </StackPanel> </WrapPanel>
6) 在Visual Studio 2013中按F5運行WPF程序,在程序運行起來之後,鼠標左鍵點擊“刷新”按鈕。在出現數據之後,使用鼠標左鍵點擊ListView中的記錄,你會發現文本框與ListView實現了聯動。如下圖。
第六步、數據更新
1) 在原來只放一個按鈕的地方,需要要多放一個按鈕,如果只是簡單的放一個按鈕,就會如下圖,所示,兩個按鈕重疊在一起。
2) 我們需要在XAML窗口中加個一個面板窗口。代碼如下。
<WrapPanel Grid.Row="3" Orientation="Horizontal" HorizontalAlignment="Right"> <Button HorizontalAlignment="Right" Name="btnRefresh" Height="22" VerticalAlignment="Top" Width="65" Click="btnRefresh_Click">刷新</Button> <Button HorizontalAlignment="Right" Name="btnUpdate" Height="22" VerticalAlignment="Top" Width="65" >更新</Button> </WrapPanel>
3) 給按鈕btnUpdate添加一個Click事件,在Click事件中實現更新代碼。代碼如下。
private void btnUpdate_Click(object sender, RoutedEventArgs e) { long id = long.Parse(textBox_CityID.Text); var city = db.S_City.Where(c => c.CityID == id).OrderBy(c => c.CityID).FirstOrDefault(); city.CityID = id; city.CityName = textBox_CityName.Text; city.DateCreated = DateTime.Parse(textBox_DateCreated.Text); city.DateUpdated = DateTime.Parse(textBox_DateUpdated.Text); city.ProvinceID = long.Parse(textBox_ProvinceID.Text); city.ZipCode = textBox_ZipCode.Text; db.SaveChanges(); }
4) 選中一條記錄,然後進行修改,更改之後,點擊“更新”按鈕。就可以把數據保存到數據庫了。如下圖。
5) 我們查詢一下數據庫,看一下數據是否已經更新到數據庫裏面了。如下圖。
WPF入門教程系列二十——ListView示例(二)