刚了解MVVM框架没多久,看到群里有人提出相关的需求,就自个摸索实践了下。顺便练练手,熟练后就可以用于
实际项目开发了。实际需求的效果如下图:
不多说,先设计界面。
<Window x:Class="MyTestDb.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:MyTestDb.ViewModel"
Title="MainWindow" Height="350" Width="675"
WindowStartupLocation="CenterScreen">
<Window.DataContext>
<vm:MytestDbModelView/>
</Window.DataContext>
<Grid>
<DataGrid AutoGenerateColumns="False" CanUserAddRows="False" Height="200" HorizontalAlignment="Left" Margin="24,22,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="291" ItemsSource="{Binding myTestDbModel.Studentlst}" DataContext="{Binding}">
<DataGrid.Columns>
<DataGridTextColumn Header="学号" Width="80" Binding="{Binding Path=StudentId}"/>
<DataGridTextColumn Header="姓名" Width="50" Binding="{Binding Path=StudentName}"/>
<DataGridTextColumn Header="性别" Width="30" Binding="{Binding Path=Gender}"/>
<DataGridTextColumn Header="专业" Width="80" Binding="{Binding Path=SubjectId}"/>
<DataGridTextColumn Header="宿舍" Width="50" Binding="{Binding Path=DomitoryId}"/>
</DataGrid.Columns>
</DataGrid>
<DataGrid AutoGenerateColumns="False" CanUserAddRows ="False" Height="200" HorizontalAlignment="Left" Margin="361,22,0,0" Name="dataGrid2" VerticalAlignment="Top" Width="262" ItemsSource="{Binding myTestDbModel.Domitorylst}">
<DataGrid.Columns>
<DataGridTextColumn Header="宿舍" Width="80" Binding="{Binding DomitoryId}" />
<DataGridTextColumn Header="学院" Width="50" Binding="{Binding SubjectName}"/>
<DataGridTextColumn Header="成员数" Width="50" Binding="{Binding MaxNumber}"/>
<DataGridTextColumn Header="床位上限" Width="60" Binding="{Binding Members}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
ViewModel业务逻辑层。
namespace MyTestDb.ViewModel
{
class MytestDbModelView
{
public MyTestDbModel testDbModel { get; set; }
private Dictionary<string, string> map;
public MytestDbModelView()
{
testDbModel = new MyTestDbModel();
map = new Dictionary<string, string>();
testDbModel.Domitorylst = SqlHelpers.GetDormitory().DefaultView;
testDbModel.Studentlst = SqlHelpers.GetStudent().DefaultView;
testDbModel.Subjectlst = SqlHelpers.GetSubjects().DefaultView;
MappingSubjects();
ChangeStudentlst();
}
private void MappingSubjects()
{
foreach (DataRowView drv in testDbModel.Subjectlst)
{
if (drv["Id"].Equals("03"))
{
drv["SubjectName"] = "软件工程";
}else if (drv["Id"].Equals("02"))
{
drv["SubjectName"] = "自动化";
}
else
{
drv["SubjectName"] = "网络工程";
}
map.Add(drv["Id"].ToString(), drv["SubjectName"].ToString());
}
}
private void ChangeStudentlst()
{
foreach(DataRowView drv in testDbModel.Studentlst)
{
drv["SubjectId"] = map[drv["SubjectId"].ToString()];
drv["StudentName"] = drv["StudentName"].ToString().Substring(0, 2);
if (drv["StudentId"].Equals("13001006"))
{
drv["StudentName"] = "刘老虎";
}
}
}
public MyTestDbModel myTestDbModel
{
get
{
return testDbModel;
}
set
{
if (testDbModel == value)
return;
testDbModel = value;
}
}
}
}
Model数据层。
namespace MyTestDb.Model
{
class MyTestDbModel : UINotifier
{
private DataView domitorylst;
private DataView studentlst;
private DataView subjectlst;
public DataView Domitorylst
{
get
{
return domitorylst;
}
set
{
domitorylst = value;
OnPropertyChanged("Domitorylst");
}
}
public DataView Studentlst
{
get
{
return studentlst;
}
set
{
studentlst = value;
OnPropertyChanged("Studentlst");
}
}
public DataView Subjectlst
{
get
{
return subjectlst;
}
set
{
subjectlst = value;
OnPropertyChanged("Subjectlst");
}
}
}
WPF做界面还是不错的,所见即所得,比QT designer要直观.还是不错,不过太局限于Windows平台了。