MVVM下DataGrid的简单应用

来源:互联网 发布:淘宝页头两侧图片 编辑:程序博客网 时间:2024/06/06 13:16

基于MVVM模式下DataGrid的简单应用,本实例将实现一个用户列表的展示和一些数据操作功能,如图1。




图1

实例要求:

(1)实现用户列表的绑定。

(2)绑定性别属性时,使用Converter对性别属性的转化。

(3)绑定日期时,对日期格式的转换。

(4)点击“编辑”按钮能够获取用户信息。

(5)点击“删除”按钮能够获取用户编号。


1、实体层

在实体层中创建用户信息实体类(UserModel.cs)。

/// <summary>/// 用户信息实体类/// </summary>public class UserModel : INotifyPropertyChanged{    private int _id;    /// <summary>    /// 编号    /// </summary>    public int Id    {        get { return _id; }        set        {            _id = value;            this.NotifyPropertyChanged("Id");        }    }    private string _name;    /// <summary>    /// 姓名    /// </summary>    public string Name    {        get { return _name; }        set        {            _name = value;            this.NotifyPropertyChanged("Name");        }    }    private int _sex;    /// <summary>    /// 性别(0:男,1:女)    /// </summary>    public int Sex    {        get { return _sex; }        set        {            _sex = value;            this.NotifyPropertyChanged("Sex");        }    }    private DateTime? _jobDate;    /// <summary>    /// 入职时间    /// </summary>    public DateTime? JobDate    {        get { return _jobDate; }        set        {            _jobDate = value;            this.NotifyPropertyChanged("JobDate");        }    }    public event PropertyChangedEventHandler PropertyChanged;    public void NotifyPropertyChanged(string propertyName)    {        if (PropertyChanged != null)        {            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));        }    }  }

2、ViewModel层

在ViewModel层中创建用户列表ViewModel类(UserListViewModel.cs)。

/// <summary>/// 用户列表ViewModel类/// </summary>public class UserListViewModel : INotifyPropertyChanged{    public List<UserModel> _userList = new List<UserModel>();    /// <summary>    /// 用户列表    /// </summary>    public List<UserModel> UserList    {        get        {            return this._userList;        }        set        {            this._userList = value;            this.RaisePropertyChanged("_userList");        }    }    /// <summary>    /// 初始化    /// </summary>    public UserListViewModel()    {        //加载数据        UserList = new List<UserModel>(){            new UserModel(){Id=1,Name="张三",Sex=0,JobDate=DateTime.Now},            new UserModel(){Id=2,Name="李四",Sex=1,JobDate=DateTime.Now},            new UserModel(){Id=3,Name="王五",Sex=0,JobDate=DateTime.Now},            new UserModel(){Id=4,Name="孙六",Sex=0,JobDate=DateTime.Now},            new UserModel(){Id=5,Name="黄七",Sex=1,JobDate=DateTime.Now},        };    }    //属性改变事件    public event PropertyChangedEventHandler PropertyChanged;    //当属性改变的时候,调用该方法来发起一个消息,通知View中绑定了propertyName的元素做出调整    public void RaisePropertyChanged(string propertyName)    {        PropertyChangedEventHandler handler = PropertyChanged;        if (handler != null)        {            handler(this, new PropertyChangedEventArgs(propertyName));        }    }}/// <summary>/// 编辑命令/// </summary>public class EditCommand : ICommand{    public bool CanExecute(object parameter)    {        return true;    }    public event EventHandler CanExecuteChanged;    public void Execute(object parameter)    {        UserModel userInfo = parameter as UserModel;        if(userInfo!=null)        {            //执行编辑        }    }}/// <summary>/// 删除命令/// </summary>public class DeleteCommand : ICommand{    public bool CanExecute(object parameter)    {        return true;    }    public event EventHandler CanExecuteChanged;    public void Execute(object parameter)    {        int id = (int)parameter;        if (id > 0)        {            //执行删除        }    }}

3、表现层

在表现层中创建Converter目录,并创建SexConverter.cs,用于对性别属性的转换。

public class SexConverter : IValueConverter{    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)    {        string result = "";        string sex = value.ToString();        if (sex == "0")        {            result = "男";        }        else if (sex == "1")        {            result = "女";        }        return result;    }    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)    {        throw new NotImplementedException();    }}

创建用户列表窗体(UserList.xaml)。

前台代码:

<Window x:Class="Simple.Calculator.WinForm.UserList"        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        xmlns:vm="clr-namespace:Simple.Calculator.ViewModel;assembly=Simple.Calculator.ViewModel"        xmlns:conv="clr-namespace:Simple.Calculator.WinForm.Converter"        Title="用户列表" Height="260" Width="400">    <Window.Resources>        <!--DataGrid样式-->        <Style TargetType="{x:Type DataGrid}" x:Key="gDataGrid">            <Setter Property="Margin" Value="0,10,0,10"/>            <Setter Property="HorizontalGridLinesBrush" Value="#c5cfd8"/>            <Setter Property="VerticalGridLinesBrush" Value="#c5cfd8"/>            <Setter Property="AutoGenerateColumns" Value="False"/>            <Setter Property="CanUserSortColumns" Value="False"/>            <Setter Property="IsReadOnly" Value="True"/>        </Style>        <Style TargetType="DataGridRow">            <Setter Property="Height" Value="32"/>            <Setter Property="FontSize" Value="12" />        </Style>        <Style TargetType="DataGridColumnHeader">            <Setter Property="SnapsToDevicePixels" Value="True" />            <Setter Property="MinWidth" Value="0" />            <Setter Property="MinHeight" Value="32" />            <Setter Property="Foreground" Value="#667a95" />            <Setter Property="FontSize" Value="14" />            <Setter Property="Template">                <Setter.Value>                    <ControlTemplate TargetType="DataGridColumnHeader">                        <Border x:Name="BackgroundBorder" BorderThickness="0,1,0,1"                              BorderBrush="#e6dbba"                               Width="Auto">                            <Grid >                                <Grid.ColumnDefinitions>                                    <ColumnDefinition Width="*" />                                </Grid.ColumnDefinitions>                                <ContentPresenter  Margin="0,0,0,0" VerticalAlignment="Center" HorizontalAlignment="Center"/>                                <Path x:Name="SortArrow" Visibility="Collapsed" Data="M0,0 L1,0 0.5,1 z" Stretch="Fill"  Grid.Column="2" Width="8" Height="6" Fill="White" Margin="0,0,50,0"                             VerticalAlignment="Center" RenderTransformOrigin="1,1" />                                <Rectangle Width="1" Fill="#c5cfd8" HorizontalAlignment="Right" Grid.ColumnSpan="1" />                            </Grid>                        </Border>                    </ControlTemplate>                </Setter.Value>            </Setter>            <Setter Property="Height" Value="30"/>        </Style>        <!--命令-->        <vm:EditCommand x:Key="EditCommand"/>        <vm:DeleteCommand x:Key="DeleteCommand"/>        <!--Converter-->        <conv:SexConverter x:Key="SexConverter"/>    </Window.Resources>        <!--列表-->    <DataGrid Grid.Row="1" Margin="10" Style="{StaticResource gDataGrid}" ItemsSource="{Binding UserList, Mode=TwoWay}">        <DataGrid.Columns>            <DataGridTextColumn Header="姓名" Width="90" Binding="{Binding Name}"/>            <DataGridTextColumn Header="性别" Width="90" Binding="{Binding Sex,Converter={StaticResource SexConverter}}"/>            <DataGridTextColumn Header="入职时间" Width="*" Binding="{Binding JobDate,StringFormat=yyyy-MM-dd}"/>            <DataGridTemplateColumn Header="操作" Width="90">                <DataGridTemplateColumn.CellTemplate>                    <DataTemplate>                        <StackPanel Orientation="Horizontal">                            <Button Content="详情" Margin="10,0" Command="{StaticResource EditCommand}" CommandParameter="{Binding}" />                            <Button Content="删除" Command="{StaticResource DeleteCommand}" CommandParameter="{Binding Id}" />                        </StackPanel>                    </DataTemplate>                </DataGridTemplateColumn.CellTemplate>            </DataGridTemplateColumn>        </DataGrid.Columns>    </DataGrid></Window>

后台代码:

/// <summary>/// UserList.xaml 的交互逻辑/// </summary>public partial class UserList : Window{    public UserList()    {        InitializeComponent();        this.DataContext = new UserListViewModel();    }}

0 0
原创粉丝点击