用了一段时间的MVVM框架,那么接下来总结一下它的相关知识点。MVVM是Model-View-ViewModel的简称,它的流程跟MVP相似,但是MVP没有学习过,但引入了Data Binding技术,实现View和ViewModel数据的双向绑定,进一步降低View和ViewModel的耦合度,减轻Activity的压力。DataBinding的用法大家可以自行上网查阅学习,这次重点是放在MVVM这个模式上。
项目结构图
Model层还是和前面的一样
ViewModel
这里ViewModel因为要和View绑定数据,所以有mAccount、mPassword、mOnClickListener,这些变量都跟View层的组件绑定在一起。除了这些外,剩下的代码和MVP中的Presenter类似。
public void Select_DiningTable(UserControl uc)
{
try
{
UserControl myuc = (UserControl)uc;
UC = myuc;
DependencyObject parent = VisualTreeHelper.GetParent(myuc);
//获取WrapPanel控件 集合
List<WrapPanel> myWP = FindVisualChildren.FindVisualChildrens<WrapPanel>(parent);
WP = myWP[0];
if (WP != null)
{
WP.Children.Clear();
}
var diningTable = (from tbDiningTable in myModels.S_DiningTable
orderby tbDiningTable.tableNumber //按照桌号排序
select new
{
diningTableID = tbDiningTable.diningTableID,
tableNumber = tbDiningTable.tableNumber,
number = tbDiningTable.number,
status = tbDiningTable.status,
affiliation = tbDiningTable.affiliation
}).ToList();
dataTable = ListToDataTable.ListToDataTablen(diningTable);
if (dataTable != null)
{
for (int i = 0; i < dataTable.Rows.Count; i++)
{
//实例化桌子(把它添加到WrapPanel里面)
DiningTable_XS_UC diningTable_XS = new DiningTable_XS_UC();
WP.Children.Add(diningTable_XS);
int DiningTableID = Convert.ToInt32(dataTable.Rows[i]["DiningTableID"].ToString());
//传递数据
var diningTableViewModel = (diningTable_XS.DataContext as DiningTableXSViewModel);
diningTableViewModel.DiningTableID = DiningTableID;
diningTableViewModel.DiningTable += Item_DiningTable;
}
}
}
catch (Exception e)
{
Debug.WriteLine(e);
}
}
View层是用来放页面代码的,由于代码较多,就不展示代码了
讲一下它的优点跟缺点
优点:
1)引入Data Binding技术后,Activity减少了很多冗余的代码,如findViewById等,使得Activity的代码非常简洁。
2)双向绑定时,当Model变化时,View-Model会自动更新,View也会自动变化。
缺点
1) 数据绑定使得 Bug 很难被调试。
2)数据双向绑定不利于代码重用。