MVVM是一个比较热门的开发框架,尽管已经出现很久了,仍然比较受欢迎。MVVM框架包括:

    M:Model;Model指的是数据模型,例如你要在页面展示联系人信息,那么Model就是联系人的模型,包括联系人的名字,电话号码,头像等。。。

    V:View;View指的是展示的页面,比如你所现在看到的这篇文章都是View。

    VM:ViewModel;ViewModel指的是对View的抽象!什么是抽象? 大概就是它实际是存在的,但你又不能直接"看"到。

对于这三者的关系,我举个简单的例子吧:

  假设你喜欢一个姑娘,姑娘都有身高,体重,脸蛋类型等等对吧.

 public class 姑娘
{
public enum 脸蛋类型
{
光滑 = ,
麻子 =
}
public string 姓名 { get; set; }
public double 身高 { get; set; }
public double 体重 { get; set; }
public 脸蛋类型 脸蛋 { get; set; }
}

光有姑娘的概念不行呀,你要的是一个实例,那好,咱new一个

private 姑娘 我的姑娘 = new 姑娘 { 体重 = , 姓名 = "狗蛋", 脸蛋 = 脸蛋类型.麻子, 身高 =  ,IsLike=false};//私有

你一看,卧槽这哪行,赶快滚蛋,重新new一个

 private 姑娘 我的姑娘 = new 姑娘 { 体重 = , 姓名 = "柳言", 脸蛋 = 脸蛋类型.光滑, 身高 = ,IsLike=true };

喜欢的姑娘有了,但你不知道姑娘是不是也喜欢你呀,所以你想对姑娘表达爱慕,看看姑娘的反应:

   private async Task 表达爱慕()
{
string 骚话 = "骚话不断,我宣你!";
try
{
var 她喜欢我 = await Say(骚话, 我的姑娘);
var 心情 = 她喜欢我 ? "得意洋洋" : "哭天抢地";
}
catch
{
Debug.WriteLine("革命尚未成功,同志仍需努力!");
}
}
private async Task<bool> Say(string _word, 姑娘 _girl)
{
//此处说完
await Task.Delay();//姑娘很矜持
Random R = new Random();
var res= R.Next(, );
switch (res)
{
case :
return true;
default:
return false;
}
}

上面的姑娘类就是Model,new的姑娘对象和表达爱慕就是ViewModel,你看到姑娘和姑娘给你的反馈就是View。

好了,现在说正经的:

  在正式讲MVVM之前先讲几个重要的知识:Binding,DataContext,INotifyPropertyChanged接口

Binding就是数据的绑定啦,比如你要展示上面姑娘的信息:

     <StackPanel x:Name="profile_SP">
<TextBlock Text="{Binding 身高,Mode=OneWay}"/>
<TextBlock Text="{Binding 体重,Mode=TwoWay}"/>
</StackPanel>

Binding的Mode有三种:OneTime;OneWay,TowWay。OneTime表示绑定这个值以后无法更改;OneWay表示后台的更改前台同步显示,但前台的更改后台不会发生改变,只会改变前台的显示;TwoWay表示无论在哪里的更改都是有效的。默认OneWay

这里的身高和体重就是Binding的Path,Binding还有一个Source属性,这里没有指定,但是在后台需是要指定,不然找不到身高和体重这两个属性了。Binding找数据源是根据控件树一级一级往上找的,如果没找到就会报错。

在后台代码中指定DataContex

profile_SP.DataContext = 我的姑娘;

也可以指定为这个页面的DataContext

this.DataContext = 我的姑娘;

但这样有个问题呀。假如你心仪这个姑娘很久了,你就一直盯着她的资料看,但是,姑娘长膘了,从原来的100长到了150,但你不知道啊,因为你看到的是她原来的资料。这时候就需要实现INotifyPropertyChanged接口来通知前端后台发生了数据更改。

  public class DispatcherManager
{
private CoreDispatcher _dispatcher;
public CoreDispatcher Dispatcher
{
get
{
return _dispatcher;
}
set
{
_dispatcher = value;
}
} private static DispatcherManager _current;
public static DispatcherManager Current
{
get
{
if (_current == null)
{
_current = new DispatcherManager();
}
return _current;
}
}
}
public class 姑娘 : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged; protected async void OnPropertyChanged([CallerMemberName]string propertyName = "")
{
if (PropertyChanged != null)
{
if (DispatcherManager.Current.Dispatcher == null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
else
{
if (DispatcherManager.Current.Dispatcher.HasThreadAccess)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
else
{
await DispatcherManager.Current.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
delegate ()
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
});
}
}
}
}
public enum 脸蛋类型
{
光滑 = ,
麻子 =
}
private double _weight;
private bool _islike;
public string 姓名 { get; set; }
public double 身高 { get; set; }
public double 体重
{
get { return _weight; }
set { _weight = value;OnPropertyChanged(); }
}
public 脸蛋类型 脸蛋 { get; set; }
public bool IsLike
{
get { return _islike; }
set { _islike = value;OnPropertyChanged(); }
}
}

好了现在姑娘长膘了我们可以随时知道,也可以随时”变心“了(都是“善变”的动物)。

  先来看View:

 <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<StackPanel>
<TextBlock Text="{Binding 姓名}"/>
<TextBlock Text="{Binding 身高}"/>
<TextBlock Text="{Binding 体重,Mode=TowWay}"/>
<TextBlock Text="{Binding 脸蛋}"/>
</StackPanel>
</Grid>

很简单,就展示了姑娘的基本信息。

接下来设置ViewModel:

public delegate void MovieWatchEventHander();
public delegate void 头脑发热EventHandler();
public event MovieWatchEventHander MovieWatched;//看完一部爱情电影后
public event 头脑发热EventHandler 头脑发热ed;
private GrilViewModel _viewModel; public GirlPage()
{
this.InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if(e.NavigationMode== NavigationMode.New)
{
this.DataContext = _viewModel = new GrilViewModel();
MovieWatched += GirlPage_MovieWatched;
头脑发热ed += GirlPage_头脑发热ed;
}
} private async void GirlPage_头脑发热ed()
{
await _viewModel.表达爱慕();
} private async void GirlPage_MovieWatched()
{
await _viewModel.表达爱慕();
}

注意这里我为什么不把事件等东西全部放到ViewModel呢?严格按照MVVM来说是的,应该放在ViewModel里,但是,我们不要为了模式而模式,尤其是页面的事件,Button的Click还好说,有Command,但是其他时间要写到MVVM里面就非常麻烦,而这并没有给我们带来明显的好处,所以还是直接放到页面的cs文件中比较好。

  说说我理解的模式吧,就好比一个剑客

第一层:手中无剑,拿一根木棍胡乱打一通;就跟我们开始写代码,不管三七二十一,实现再说;

第二层:手中有剑,会一招一式,此时可以行走江湖,一般来说应付得过来;按照“模式”来;

第三曾:手中无剑,心中有剑,此时就是绝顶高手,杀人于无形;模式变通,无招胜有招;

  哈哈,以上就是我瞎jb吹nb的,其实我就是个刚入门的菜鸟。希望各位大侠轻喷!

UWP开发-重新理解MVVM的更多相关文章

  1. 领域驱动和MVVM应用于UWP开发的一些思考

    领域驱动和MVVM应用于UWP开发的一些思考 0x00 起因 有段时间没写博客了,其实最近本来是根据梳理的MSDN上的资料(UWP开发目录整理)有条不紊的进行UWP学习的.学习中有了心得体会或遇到了问 ...

  2. UWP开发的一些思考

    UWP开发的一些思考 领域驱动和MVVM应用于UWP开发的一些思考 0x00 起因 有段时间没写博客了,其实最近本来是根据梳理的MSDN上的资料(UWP开发目录整理)有条不紊的进行UWP学习的.学习中 ...

  3. Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App

    安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...

  4. UWP开发入门(十六)——常见的内存泄漏的原因

    本篇借鉴了同事翔哥的劳动成果,在巨人的肩膀上把稿子又念了一遍. 内存泄漏的概念我这里就不说了,之前<UWP开发入门(十三)——用Diagnostic Tool检查内存泄漏>中提到过,即使有 ...

  5. 基于Prism.Windows的UWP开发备忘

    以前做UWP开发都是使用MvvmLight,主要是简单易上手,同时也写了很多MvvmLight的开发系列文章: UWP开发必备以及常用知识点总结 UWP开发之Mvvmlight实践九:基于MVVM的项 ...

  6. 理解MVVM在react、vue中的使用

    理解MVVM在react.vue中的使用 一:什么是MVC.为什么不用MVC 1:MVC的含义: M(modal):是应用程序中处理数据逻辑的部分. V (view)  :是应用程序中数据显示的部分. ...

  7. UWP开发必备:常用数据列表控件汇总比较

    今天是想通过实例将UWP开发常用的数据列表做汇总比较,作为以后项目开发参考.UWP开发必备知识点总结请参照[UWP开发必备以及常用知识点总结]. 本次主要讨论以下控件: GridView:用于显示数据 ...

  8. UWP开发之控件:用WebView做聊天框

    目录 说明 WebView存在的价值 使用WebView的几个重要技巧 使用WebView做的聊天框 说明 大家都知道,无论是之前的Winform.WPF还是现在的IOS.Android开发中,都存在 ...

  9. Win10 UWP 开发系列:使用SQLite

    在App开发过程中,肯定需要有一些数据要存储在本地,简单的配置可以序列化后存成文件,比如LocalSettings的方式,或保存在独立存储中.但如果数据多的话,还是需要本地数据库的支持.在UWP开发中 ...

随机推荐

  1. 【Thinking in Java-CHAPTER 3】操作符

    优先级 赋值 对象在使用c=d,那么c和d都指向原本只有d指向的那个对象. 方法调用中的别名问题:当一个对象作为参数传递到一个函数中,函数改变了这个参数,则改变了传递进来的对象: 自增和自减 浮点型的 ...

  2. AC_Dream 1216 G - Beautiful People

    题意:有n个人每人有一个力气值Si,美丽值Bi,满足Bi>Bj&&Si>Sj 或者 Bi<Bj&&Si<Sj 的人可以一起参见晚会,问最多有多少 ...

  3. Ember Charts – 基于 Ember & D3 的图表库

    Ember Charts 是一个基于 Ember.js 和 D3.js 的图表库.它包括时间序列.柱状图.饼图.点图,很容易扩展和修改.这些图表组件代表图表交互性和演示的最佳实践,是高度可定制和可扩展 ...

  4. nodejs 常用全局包

    1.nodemon 更改node程序后程序自动启动 (nodemon app.js) npm install nodemon  -g 2.gulp 压缩合并代码等 npm install gulp - ...

  5. webpack实战

    webpack实战 30分钟手把手教你学webpack实战 2015-09-08 23:02 by 龙恩0707, 175 阅读, 0 评论, 收藏, 编辑 30分钟手把手教你学webpack实战 阅 ...

  6. Mysql学习笔记(十一)临时表+视图

    学习内容: 临时表和视图的基本操作... 临时表与视图的使用范围... 1.临时表   临时表:临时表,想必大家都知道这个概念的存在...但是我们什么时候应该使用到临时表呢?当一个数据库存在着大量的数 ...

  7. Genymotion模拟器环境搭建中的各种坑,终极解决办法

    最近刚进入了一家公司,因为要做自动化测试,web端的业务需要移动端来进行配合,想了想还是利用genymotion模拟器吧:很久前装过,那也是一路坎坷啊,结果这次还是遇到坑了,搞了老半天:我希望我踩过的 ...

  8. [Tool] PLSQL使用技巧

    1.PL/SQL Developer保存自定义界面布局 Tools->Preferences->User Interface->Options->Autosave deskto ...

  9. Winform开发框架之权限管理系统改进的经验总结(1)-TreeListLookupEdit控件的使用

    最近一直在做一些技术性的研究和框架改进工作,博客也落下好几天没有更新了,也该是时候静下心来,总结这段时间的一些技术改进的经验了.和上一阶段的CRM系统开发和技术研究一样,我都喜欢在一个项目或者模块完成 ...

  10. 在SQL存储过程中给条件变量加上单引号

    在SQL存储过程中给条件变量加上单引号,不加语句就会出问题,以下就是在存储过程中将条件where设置成了动态变化的,给where赋完值再和前面的语句拼接,再execute(SQL) ), )), )+ ...