1、新建一个WPF、Silverlight或Windows Phone的项目。
2、在项目中新建几个文件夹,Models、Views、ViewModels、Data、Service、Commands。
3、在ViewModels文件夹中新建一个NotificationObject.cs类,代码如下:
public class NotificationObject:INotifyPropertyChanged
{
#region INotifyPropertyChanged 成员
public event PropertyChangedEventHandler PropertyChanged;
#endregion
public void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
4、在Commands文件夹中新建一个DelegateCommand.cs命令类,代码如下:
public class DelegateCommand : ICommand
{
#region ICommand 成员
public Action<object> ExecuteAction { get; set; }
public Func<object, bool> CanExecuteFunc { get; set; }
public bool CanExecute(object parameter)
{
if (this.CanExecuteFunc == null)
{
return true;
}
return this.CanExecuteFunc(parameter);
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
if (this.ExecuteAction == null)
{
return;
}
this.ExecuteAction(parameter);
}
#endregion
}
5、在Data文件夹下新建一个xml文件,Data.xml,内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<Students>
<Student>
<Name>张三</Name>
<Age>25</Age>
<Sex>男</Sex>
<Job>IT开发工程师</Job>
</Student>
<Student>
<Name>李四</Name>
<Age>26</Age>
<Sex>女</Sex>
<Job>销售经理</Job>
</Student>
</Students>
6、在Models文件夹下,新建一个Student.cs类,代码如下:
public class Student
{
public string Name { get; set; }
public string Age { get; set; }
public string Sex { get; set; }
public string Job { get; set; }
}
7、在Services文件下,新建一个IDataService.cs接口文件,代码如下:
public interface IDataService
{
List<Student> GetAllStudents();
}
还有一个XmlDataService.cs读取xml的类,用来实现以上接口,代码如下:
public class XmlDataService : IDataService
{
#region IDataService 成员
public List<Student> GetAllStudents()
{
List<Student> studentList = new List<Student>();
string xmlFileName = System.IO.Path.Combine(Environment.CurrentDirectory, @"Data\Data.xml");
XDocument document = XDocument.Load(xmlFileName);
var students = document.Descendants("Student");
foreach (var stu in students)
{
Student studnet = new Student();
studnet.Name = stu.Element("Name").Value;
studnet.Age = stu.Element("Age").Value;
studnet.Sex = stu.Element("Sex").Value;
studnet.Job = stu.Element("Job").Value;
studentList.Add(studnet);
}
return studentList;
}
#endregion
}
8、在ViewModels文件夹下,新建一个StudentItemViewModel.cs类,代码如下:
class StudentItemViewModel:NotificationObject
{
public Student Student { get; set; }
private bool _isSelected;
public bool IsSelected
{
get { return _isSelected; }
set
{
_isSelected = value;
this.RaisePropertyChanged("IsSelected");
}
}
}
在新建一个类,StudentViewModel.cs,代码如下:
class StudentViewModel : NotificationObject
{
//命令属性
public DelegateCommand SelectStudentItemCommand { get; set; }
//数据属性,用来统计选中多少学生
private int _count;
public int Count
{
get { return _count; }
set
{
_count = value;
this.RaisePropertyChanged("Count");
}
}
private Student _student;
public Student Student
{
get { return _student; }
set
{
_student = value;
this.RaisePropertyChanged("Student");
}
}
private List<StudentItemViewModel> _studentList;
public List<StudentItemViewModel> StudentList
{
get { return _studentList; }
set
{
_studentList = value;
this.RaisePropertyChanged("StudentList");
}
}
public StudentViewModel()
{
this.LoadStudentList();
this.SelectStudentItemCommand = new DelegateCommand(new Action(this.SelectStudentItemCommandExecute));
}
void LoadStudentList()
{
XmlDataService ds = new XmlDataService();
var students = ds.GetAllStudents();
this.StudentList = new List<StudentItemViewModel>();
foreach (var student in students)
{
StudentItemViewModel item = new StudentItemViewModel();
item.Student = student;
this.StudentList.Add(item);
}
}
private void SelectStudentItemCommandExecute()
{
this.Count = this.StudentList.Count(p=>p.IsSelected==true);
}
}
9、在Views文件夹下,新建一个Student.xaml,内容如下:
<Grid>
<DataGrid AutoGenerateColumns="False" CanUserAddRows="False" ItemsSource="{Binding StudentList}" CanUserDeleteRows="False" Height="138" HorizontalAlignment="Left" Margin="10,82,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="256">
<DataGrid.Columns>
<DataGridTextColumn Header="姓名" Binding="{Binding Student.Name}" Width="50"></DataGridTextColumn>
<DataGridTextColumn Header="年龄" Binding="{Binding Student.Age}" Width="50"></DataGridTextColumn>
<DataGridTextColumn Header="性别" Binding="{Binding Student.Sex}" Width="50"></DataGridTextColumn>
<DataGridTextColumn Header="工作" Binding="{Binding Student.Job}" Width="50"></DataGridTextColumn>
<DataGridTemplateColumn Header="选中" SortMemberPath="IsSelected">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Path=IsSelected,UpdateSourceTrigger=PropertyChanged}" Command="{Binding Path=DataContext.SelectStudentItemCommand,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGrid}}}">
</CheckBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
<TextBlock Height="23" HorizontalAlignment="Left" Margin="21,238,0,0" Name="textBlock7" Text="共选中:" VerticalAlignment="Top" />
<TextBlock Height="23" HorizontalAlignment="Left" Margin="75,238,0,0" Name="textBlock8" Text="{Binding Count}" VerticalAlignment="Top" />
</Grid>
public partial class Student : Window
{
public Student()
{
InitializeComponent();
this.DataContext = new StudentViewModel();
}
}
10、在App.xaml中设置起始页
<Application x:Class="WPFDemo2.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Views/Student.xaml">
<Application.Resources>
</Application.Resources>
</Application>
11、运行一下程序,看看效果吧。