WPF學習分享(一)——DataGrid
阿新 • • 發佈:2018-10-31
使用DataGrid構建簡單的表格
最近由於想做一個Windows的桌面應用程式,正好最近看了一下C#,在網上找了一下關於Windwos桌面應用的相關檔案,最後選擇使用WPF來開發。
使用DataGrid用到的功能
- DataGrid通過使用資料繫結,實現資料的雙向通知。
- 在DataGrid的
DataGridComboBoxColumn
使用列舉。 - DataGrid的自定義Cell的使用。
- DataGrid多出的一行的去除。
首先定義一個Model,省略了部分程式碼
public enum Sexs { 男, 女 } ;
public enum Roles { 非法使用者,全權使用者, 可寫使用者,只讀使用者 };
public delegate void change(User user);
//實現介面以進行資料繫結
public class User : INotifyPropertyChanged
{
private String _name;
//使用了委託,在單元格的值改變的時候呼叫委託,。,
//本來是可以直接寫在監聽屬性變化的
//但是由於得到資料的時候也會觸發OnPropertyChanged()
//所以就打算單獨使用delegate
//應該有更好的實現方法,暫時沒發現
public event change Change;
#region 屬性
public String Name
{
get { return _name; }
set
{
if (_name != value)
{
_name = value;
OnPropertyChanged ();
}
}
}
//省略。。。。。
#endregion
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
Change?.Invoke(this);
}
}
然後就是View層的實現了。
- 先是資料繫結,通過使用標籤的
Binding
屬性,將上面的Model的欄位對應到單元格上。 - 然後是列舉的使用。首先要引入列舉型別,使用
xmlns:assembly="clr-namespace:System;assembly=mscorlib"
引入,用到的列舉只要在xmlns:local="clr-namespace:AdressBook"
這個名稱空間下就可以了。 - 日期的格式化輸出(與字元格式化輸出同理),通過在Binding裡面使用
StringFormat='{}{0:yyyy年MM月dd日}',ConverterCulture=zh-CN
即可。 - 如果要自定義GridData的單元格的內容,像是新增按鈕什麼的,可以使用標籤
DataGridTemplateColumn
- DataGrid的在顯示的時候會自動生成最後一行,倒是展示的時候多了一行,可以通過設定DataGrid
CanUserAddRows
的值為false,由於我直接在xaml設定的時候會警告,所以我就在Controller裡面設定了。。。
<UserControl x:Class="AdressBook.UserList"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:AdressBook"
xmlns:assembly="clr-namespace:System;assembly=mscorlib"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="800">
<UserControl.Resources>
<ObjectDataProvider x:Key="SexEnum" MethodName="GetValues"
ObjectType="{x:Type assembly:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="local:Sexs"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</UserControl.Resources>
<DataGrid x:Name="data" AutoGenerateColumns="False" >
<DataGrid.Columns>
<!--<DataGridCheckBoxColumn Width="44" Header="" Binding="{Binding IsSelected}"/>-->
<DataGridTextColumn Width="80" Header="ID" Binding="{Binding id}"/>
<DataGridComboBoxColumn Width="80" Header="性別" ItemsSource="{Binding Source={StaticResource SexEnum}}" SelectedItemBinding="{Binding Sex}"/>
<DataGridTextColumn Width="80" Header="生日" Binding="{Binding Birthday,StringFormat='{}{0:yyyy年MM月dd日}',ConverterCulture=zh-CN}"/>
<DataGridTemplateColumn Header="" Width="44">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="評論" Click="CommentAction"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</UserControl>
最後就是Controller的實現了。
public partial class UserList : UserControl
{
static ObservableCollection<User> list;
public UserList()
{
InitializeComponent();
list = new ObservableCollection<User>(Mapper.GetInstance().Select());
foreach (User u in list)
{
//使用委託
u.Change += change;
}
//設定資料來源
data.DataContext = list;
//讓DataGrid的最後一行消失
data.CanUserAddRows = false;
}
private void ViewComment(object sender, RoutedEventArgs e)
{
.........
}
//資料改變的時候的操作
void change(User user)
{
........
}
}