使用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)
{
........
}
}