DataGrid示例的后台代碼
1) 通過Entity Framework 6.1 從數據庫(本地數據庫(local)/Test中的S_City表中讀取城市信息數據,從S_ Province表中讀取省份信息,然后通過綁定的方式反數據顯示到WPF的Window上的一個DataGrid上。具體代碼如下。
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using WpfApp1.Models;
namespace WpfApp1
{
/// <summary>
/// WindowGrid.xaml 的交互邏輯
/// </summary>
public partial class WindowGrid : Window
{
public WindowGrid()
{
InitializeComponent();
Database.SetInitializer<TestDBContext>(null);
}
private void btnRefresh_Click(object sender, RoutedEventArgs e)
{
BindDrp();
GetData();
}
TestDBContext db = new TestDBContext();
protected void GetData()
{
List<S_City> list = db.S_City.ToList<S_City>();
gridCitys.ItemsSource = list;
}
protected void BindDrp()
{
List<S_Province> list = db.S_Province.ToList<S_Province>();
cboProvince.ItemsSource = list;
ProvinceList = list;
}
public List<S_Province> ProvinceList
{ get; set; }
private void btnUpdate_Click(object sender, RoutedEventArgs e)
{
try
{
S_City city = (S_City)gridCitys.SelectedItem;
city.DateUpdated = DateTime.Now;
txtMsg.Text = city.ProvinceID + "//" + city.CityName;
S_City modifyCity = db.S_City.Find(city.CityID);
modifyCity = city;
db.SaveChanges();
txtMsg.Text += "保存成功!";
}
catch (Exception ex)
{
txtMsg.Text += ex.Message;
}
}
}
}
2) 寫完了上面的代碼之后,按F5,程序運行了起來,點“刷新”。你會看到如下結果。如下圖的結果。

3) DataGrid自動生成了一些列,而實際上我們是不需要這些自動生成列的。所以需要把AutoGenerateColumns設為False。再執行第2步。就會看到如下的結果。

4) 雖然實現了下拉框的內容顯示,但是卻存在一個問題,繼不顯示應該顯示的內容。最后查詢網絡之后才知道,應許做如下修改。
DataGrid的ComboBox列的綁定方式
DataGridComboBoxColumn對數據源有下面的要求:
使用下列選項之一,若要填充下拉列表,首先設置 ComboBox 的 ItemsSource 屬性:
- 1、靜態資源。有關更多信息,請參見 StaticResource 標記擴展。
- 2、x: 靜態代碼實體。有關更多信息,請參見 x:Static 標記擴展。
- 3、ComboBoxItem 類型的內聯集合。
1) 在使用DataGrid的時候,有時候需要使某些列為ComboBox,這時自然想到使用DataGridComboBoxColumn,但是如果使用的是ItemsSource數據綁定后台的對象,就會發現,這根本就不能用。
2) 默認刷新按鈕之后,下拉框中沒有數據。我仔細看了一下代碼,前台代碼中並沒有進行數據綁定,而且后台代碼中也沒寫綁定的語句。前台代碼如下。如果如下圖。
<DataGridComboBoxColumn ClipboardContentBinding="{x:Null}" Header="ProvinceID" SelectedValueBinding="{x:Null}" SelectedItemBinding="{x:Null}" TextBinding="{x:Null}"/>

3) 我對程序進行了一些修改,前台代碼不做修改,還是如下。
<DataGridComboBoxColumn x:Name="cboProvince" ClipboardContentBinding="{x:Null}" Header="ProvinceID" SelectedValueBinding="{x:Null}" SelectedItemBinding="{x:Null}" TextBinding="{x:Null}"/>
后台代碼如下,進行了下拉框的綁定。
protected void BindDrp()
{
List<S_Province> list = db.S_Province.ToList<S_Province>();
cboProvince.ItemsSource = list;
}
結果如下圖。綁定是成功了,但是不顯示我需要顯示的值。
4) 對前台代碼進行了如下修改。對DataGridComboBoxColumn進行了綁定。然后F5,運行發現,下拉框的顯示是正常了,但是不論我怎么改,DataGrid中的“ProvinceID”默認只是顯示空白,什么也不顯示,如下圖。前台代碼如下。
<DataGridComboBoxColumn x:Name="cboProvince" ClipboardContentBinding="{x:Null}" Header="ProvinceID" SelectedValuePath="ProvinceID" DisplayMemberPath="ProvinceName" SelectedItemBinding="{x:Null}" TextBinding="{Binding ProvinceName}"/>

5) 但是當我加載數據到DataGrid中時,ProvinceID列默認還是為空,並沒有顯示我想顯示的省份名稱這樣的數據。經過一番的查找與學習,最終把前台代碼修改成如下。這樣修改之后在DataGrid默認綁定數據之后,ProvinceID列達到了我想要的結果。如下圖。
<DataGridComboBoxColumn x:Name="cboProvince" ClipboardContentBinding="{x:Null}" Header="ProvinceID" SelectedValuePath="ProvinceID" SelectedValueBinding="{Binding Path=ProvinceID,UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="ProvinceName" SelectedItemBinding="{x:Null}" >
</DataGridComboBoxColumn>


