ListView 控制項和 DataGridView 控制項 ListView 是跟 Winform 中 DataGridView 用法以及顯示效果差不多的一個 WPF 控制項,可以通過列表的方式方便的顯示數據; 在 ListView 控制項中 DataSource 屬性在這裡是 ;單條數據載入的方法是 , ...
ListView 控制項和 DataGridView 控制項
ListView 是跟 Winform 中 DataGridView 用法以及顯示效果差不多的一個 WPF 控制項,可以通過列表的方式方便的顯示數據;
<!-- ListView 控制項 Xaml 代碼 -->
<ListView Name="listView" Margin="10,10,9.6,10">
<ListView.View>
<GridView>
<GridViewColumn Header="任務"/>
<GridViewColumn Header="任務描述"/>
<GridViewColumn Header="迴圈周期(秒)"/>
<GridViewColumn Header="任務狀態/>
</GridView>
</ListView.View>
</ListView>
DataGridView 控制項的使用中,通常我們都會創建一個類用來儲存數據,讀取數據之後再創建一個這個類的集合,然後將集合賦給 dataGridView1.DataSource
屬性;也可不用集合,直接在迴圈中把數據一條一條的載入 dateGridView1.Rows.Add()
;
// 先創建一個用來儲存數據的類
class UserInfo
{
public string Name { get; set; }
public int Age { get; set; }
}
// WinForm:DataGridView 控制項
// 方法一:創建一個對象集合,賦值給 DataSource 屬性
List<UserInfo> infos = new List<UserInfo>();
for(int i = 0; i > 10; i++)
{
infos.Add(new UserInfo
{
Name = $"Light_{i}",
Age = i
});
}
dataGridView1.DataSource = infos;
// 方法二:一條一條的添加數據
for(int i = 0; i > 10; i++)
{
dateGridView1.Rows.Add(new UserInfo
{
Name = $"Light_{i}",
Age = i
});
}
在 ListView 控制項中 DataSource 屬性在這裡是 listView.ItemsSource
;單條數據載入的方法是 listView.Items.Add();
,整體用法還是大同小異;
// WPF:ListView 控制項
// 方法一:創建一個對象集合,賦值給 ItemsSource 屬性
List<UserInfo> infos = new List<UserInfo>();
for(int i = 0; i > 10; i++)
{
infos.Add(new UserInfo
{
Name = $"Light_{i}",
Age = i
});
}
listView.ItemsSource = infos;
// 方法二:一條一條的添加數據
for(int i = 0; i > 10; i++)
{
listView.Items.Add(new UserInfo
{
Name = $"Light_{i}",
Age = i
});
}
INotifyPropertyChanged 介面
命名空間:System.ComponentModel
INotifyPropertyChanged 是一個非常強大的介面,用於向對象綁定的客戶端控制項發出對象屬性已更改的通知;
用人話說就是:正常我們向上面一樣,把對象綁定到控制項用來顯示數據,有一個缺點:每次更改對象的屬性之後,我們需要手動的重新再去綁定數據,否則數據是不會刷新顯示修改後的值的;
但是如果對象實現了 INotifyPropertyChanged 介面的話,我們根本不用擔心這些問題,直接修改已綁定對象的屬性,客戶端就會自動刷新顯示數據;
比如說,上面我們創建的 UserInfo 類就可以修改成這樣:
class UserInfo : System.ComponentModel.INotifyPropertyChanged
{
private string name;
private int age;
// 屬性發生更改時觸發的事件,由每個屬性的 Set 訪問器調用
public event PropertyChangedEventHandler PropertyChanged;
public string Name
{
get => name;
set
{
name = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Name"));
}
}
public string Age
{
get => age;
set
{
age = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Age"));
}
}
}
註意,我們為 UserInfo 類實現了 INotifyPropertyChanged 介面後,就不能用 List<T>
去創建集合了,需要用 ObservableCollection<T>
來創建 UserInfo
對象實例的集合;
因為List<T>
集合是強類型的 object 集合,綁定完成之後再進行修改添加操作是沒辦法通知已綁定的客戶端控制項的;
而 Observablecollection<T>
是動態數據集合,當 ObservableCollection<T>
添加一項時,會自動通知綁定的控制項做相應修改;如果希望當 ObservableCollection<T>
集合中對象的屬性發生改變時通知 UI,則 T
需要實現 INotifyPropertyChanged 介面;
// 用 Observablecollection<T> 創建集合
Observablecollection<UserInfo> infos = new Observablecollection<UserInfo>();
infos.Add(new UserInfo
{
Name = "Light",
Age = 18
});
// 為 DataGridView 控制項綁定對象
dataGridView1.DataSource = infos;
// 為 ListView 控制項綁定對象
listView.ItemsSource = infos;
之後每次修改數據,就可以直接獲取綁定的對象然後修改對象屬性就可以了,無需再做任何操作;
// DataGridView 控制項
// 獲取選中行,返回當前綁定對象
UserInfo info = (UserInfo)dataGridView1.SelectedRows[0].DataBoundItem;
info.Name = "Liang";
info.Age = 18;
// ListView 控制項
// 獲取選中行,返回當前綁定對象
UserInfo info = (UserInfo)listView.SelectedItem;
info.Name = "Liang";
info.Age = 18;