天天看点

MVVM下DataGrid的简单应用

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

MVVM下DataGrid的简单应用

图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();
    }
}
           

继续阅读