WPF学习分享(一)——DataGrid

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/madonghyu/article/details/82745614

使用DataGrid构建简单的表格

最近由于想做一个Windows的桌面应用程序,正好最近看了一下C#,在网上找了一下关于Windwos桌面应用的相关文件,最后选择使用WPF来开发。


使用DataGrid用到的功能

  1. DataGrid通过使用数据绑定,实现数据的双向通知。
  2. 在DataGrid的DataGridComboBoxColumn使用枚举。
  3. DataGrid的自定义Cell的使用。
  4. 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层的实现了。

  1. 先是数据绑定,通过使用标签的Binding属性,将上面的Model的字段对应到单元格上。
  2. 然后是枚举的使用。首先要引入枚举类型,使用xmlns:assembly="clr-namespace:System;assembly=mscorlib"引入,用到的枚举只要在xmlns:local="clr-namespace:AdressBook"这个命名空间下就可以了。
  3. 日期的格式化输出(与字符格式化输出同理),通过在Binding里面使用StringFormat='{}{0:yyyy年MM月dd日}',ConverterCulture=zh-CN即可。
  4. 如果要自定义GridData的单元格的内容,像是添加按钮什么的,可以使用标签DataGridTemplateColumn
  5. DataGrid的在显示的时候会自动生成最后一行,倒是展示的时候多了一行,可以通过设置DataGridCanUserAddRows的值为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)
        {
        ........
        }
		
    }

猜你喜欢

转载自blog.csdn.net/madonghyu/article/details/82745614
今日推荐