1. 关于XamarinQml、数据绑定、MVCMVVM 相关的散讲
  2. SURFSKY 2017.02
  3.  
  4. 最近又在学习Xamarin了?为什么是“又”?有几个利好消息,让我重新拾起它:
  5. ()微软去年收购了Xamarin,而且免费。原先的费用会吓死人,而且按人头+平台来收费。
  6. ()Xamarin.Forms 的出现,UI层也可以复用了,不像原先只能逻辑层代码复用。
  7. ()IDE增强:
  8. Xamarin Forms Previewer,可以直接预览 XAML 的外观。
  9. XAML 智能感应的增强,现在编写XAML舒服多了。原先编写XAML可不是件轻松的事情,所以之前的教材全部都是用C#写的UI,这很不利于视图和逻辑的分离。
  10. Visual Studio for mac 发布,可替代原先的 Xamarin Studio for mac。毕竟,在mac下编写ios/Android app无论性能还是便利性都要比在windows上好得多。
  11. 不愧是宇宙最强IDE开发商,一接手Xamarin,编辑器就增强了:)
  12. ()真正的一个语言可以编写跨平台移动app,包括后台、iosandroidwindows uwp
  13. 数据接口和后台:用 asp.net 写即可
  14. 移动客户端APIXamarin 已用C#封装好,如果需要平台专用功能,直接调用即可。
  15. 这很利于节省成本、积累技术、简化员工招招聘和培训。
  16. ()性能
  17. 对于ios平台,xamarin是将c#编译成原生的代码。android是嵌入了.NET运行时。
  18. 实测试了下,ios下没有任何问题,3秒左右进入主界面,进去后性能就和原生的没有区别了
  19. android的启动略慢,估计要5秒,进去后性能没有问题。
  20. 加个欢迎屏可以稍微减缓客户等待的焦虑感。
  21.  
  22. 当然还有缺陷和期望
  23. 缺陷
  24. Xamarin.Forms 的控件是转化为各平台原生控件的,也就是说,这些控件在各平台上外观都有区别!
  25. IED
  26. 复杂的 XAML previewer展示不出来。
  27. 无法拖拽控件快速设计页面。
  28. VS MAC 有时候屏幕刷新不过来,一片白。
  29. 经常出现“不是在活动配置中生成的项目”,无法加载项目。
  30. 启动速度还是慢了点,位于可容忍的边缘。
  31. 没有官方的、统一的移动平台功能 API 库。
  32. 类似PhoneGap那样的,访问摄像头、传感器等API,一套代码各平台通用。
  33. 现有的这些功能API是分散在各平台自己的库里的,学习一个统一库与学习多平台类库,工作量当然不一样。
  34. 早些年有Xamarin.Mobile项目,但与Xamarin.Forms不兼容已经废弃了。
  35. 现在这些功能API插件处于散乱琐碎状态,要自己一个个去Xamarin Compoents/GitHub上找。
  36. 期望
  37. 不知什么时候可以直接拖拽 Xamarin Forms 控件,一个平台也行啊。
  38. 加快 Xamarin Form Android app 启动速度。
  39. 需要一套外观一致的 Xamarin Forms UI 库,但短期内不会有,要我们直接写了(*)
  40. 官方推出统一的跨平台移动功能 API 库:Xamarin.Forms.Mobile(*)
  41. 备注
  42. 当然 Visual Studio for mac 还是预览版本,等正式版估计BUG会少一些。
  43. (*)打算启动这两个项目,欢迎有共同志向的同学参与。
  44.  
  45. 相比较 Qt
  46. 性能还是Qt占优的,毕竟底层是C++写的。但Xamarin的性能也在可容忍范围内,主要是启动时间稍慢了点。
  47. APP 大小。
  48. 都在20M以上,
  49. Qt
  50. V-Play apps 基于Qt的游戏引擎 52.4M
  51. 新发布的 Qt .8据说可以裁剪库的大小,将APP压缩到45M
  52. Xamarin 我也搞不清楚了。
  53. Xuni Explorer 只有 5.6 M
  54. Evlove 46.1M
  55. 随便编译个debug版本的,估计有60Mrelease的还没试验
  56. 虽然说理论上 Qml 可以摆平一切界面问题,但我们不可避免的要涉及到各平台的插件,那么你真正需要学习的语言有:
  57. QML :
  58. Javascript :
  59. C++ : Qt类库
  60. Object-C :
  61. Android :
  62. ps.真希望Qml能发展成独立的开发语言(参照 swift
  63. 强类型
  64. 可编译
  65. 简化创建组件语法,直接用new MyItem(),而不是复杂的Qt.CreateComponent.....
  66. 摒弃jsv4引擎,提供工具将js迁移为标准Qml
  67. 独立发展 Qml 类库
  68. 更便利的方式访问c++类库,类似swift那样,只需Import即可使用
  69.  
  70. 绑定的前世今生
  71. 若要监控一个对象的若干属性变化情况,传统写法是为每个要监控的属性加上一个值变更事件,然后让调用者添加这个事件
  72. public event Event FirstNameChanged;
  73. public string FirstName {get; set;}
  74. sample.FirstNameChanged += (o, value)=>txtbox.Text = value;
  75. 这样很可能要写很多的属性变更事件,而且不能自动给订购者赋值
  76. 什么是绑定?它事实上做了两件事
  77. ()监听对象指定属性,若变化,则通知给订购者
  78. ()给订购者赋值
  79. 微软给出的官方方案是
  80. ()绑定系统维护了一个表格(在绑定表达式中指定),字段大致包括:
  81. object SourceObject : 监听对象
  82. string SourcePropertyName : 监听对象的属性名称
  83. object TargetObject : 订购者
  84. string ValuePath : 赋值路径
  85. ()让数据实现INotifyPropertyChanged接口
  86. public event PropertyChangedEventHandler PropertyChanged;
  87. 若监听对象的属性有变动,则触发这个事件,通知绑定系统
  88. 这个事件的参数中包含了监听对象和变更的属性名称(SourceObject + SourcePropertyName
  89. ()绑定系统去查表,给订购者进行赋值
  90. TargetObject = SourceObject.SourcePropertyName.ValuePath
  91.  
  92. 属性变更通知
  93. INotifyPropertyChanged接口(属性变更的时候通知下绑定系统,我的哪个属性变更了,快处理啊)
  94. class Sample : INotifyPropertyChanged
  95. {
  96. // INotifyPropertyChanged 接口成员
  97. public event PropertyChangedEventHandler PropertyChanged;
  98.  
  99. // 属性
  100. private string firstName;
  101. public string FirstName
  102. {
  103. get { return firstName; }
  104. set
  105. {
  106. firstName = value;
  107. if (PropertyChanged != null)
  108. PropertyChanged(this, new PropertyChangedEventArgs("FirstName"));
  109. }
  110. }
  111. }
  112. // 绑定(textBox.Text <= sourceObject.FirstName)
  113. Sample sourceObject = new Sample();
  114. textbox.DataBindings.Add("Text", sourceObject, "FirstName");
  115. sourceObject.FirstName = "Stack";
  116.  
  117. 我们做一下封装,加上值相等判断。
  118. 定义 ViewModelBase
  119. using System;
  120. using System.ComponentModel;
  121. using System.Runtime.CompilerServices;
  122. namespace Xamarin.FormsBook.Toolkit
  123. {
  124. public class ViewModelBase : INotifyPropertyChanged
  125. {
  126. public event PropertyChangedEventHandler PropertyChanged;
  127. protected bool SetProperty<T>(ref T storage, T value, string propertyName = null)
  128. {
  129. if (Object.Equals(storage, value))
  130. return false;
  131. storage = value;
  132. if (PropertyChanged != null)
  133. PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  134. return true;
  135. }
  136. }
  137. }
  138. 让数据模型类继承自ViewModelBase
  139. public class InformationViewModel : ViewModelBase
  140. {
  141. string name;
  142. public string Name
  143. {
  144. get { return name; }
  145. set
  146. {
  147. if (SetProperty(ref name, value, "Name"))
  148. {
  149. ...属性已经更新,该干点啥
  150. };
  151. }
  152. }
  153. }
  154.  
  155. Xamarin 的方案(使用 BindableObject)
  156. 代码
  157. public RadioButtonGroup : BindableObject
  158. {
  159. public static readonly BindableProperty TextProperty = BindableProperty.Create("Text", typeof(string), typeof(Radio), "", propertyChanged: TextChanged);
  160. private static void TextChanged(BindableObject bindable, object oldValue, object newValue)
  161. {
  162. var radio = (Radio)bindable;
  163. radio.Lbl.Text = (string)newValue;
  164. }
  165. public string Text
  166. {
  167. get {return (string)this.GetValue(TextProperty);}
  168. set {this.SetValue(TextProperty, value);}
  169. }
  170. }
  171. this.Icon.SetBinding(Image.IsVisibleProperty, new Binding("ShowRadio", source: this));
  172. 说明
  173. 这里的BindableProperty是用于描述这个属性的元信息,如名称、类型、默认值、绑定方向、属性值变更事件
  174. BindableObject INotifyPropertyChanged 的封装,增加了绑定上下文、属性变更中、属性变更完毕事件等逻辑
  175. public abstract class BindableObject : INotifyPropertyChanged, IDynamicResourceHandler
  176. {
  177. public static readonly BindableProperty BindingContextProperty;
  178. public object BindingContext { get; set; }
  179. protected BindableObject ();
  180.  
  181. // Methods
  182. protected void ApplyBindings (object oldContext = null);
  183. public void ClearValue (BindableProperty property);
  184. public void ClearValue (BindablePropertyKey propertyKey);
  185. public object GetValue (BindableProperty property);
  186. protected virtual void OnBindingContextChanged ();
  187. protected virtual void OnPropertyChanged ([CallerMemberName] string propertyName = null);
  188. protected virtual void OnPropertyChanging ([CallerMemberName] string propertyName = null);
  189. public void RemoveBinding (BindableProperty property);
  190. public void SetBinding (BindableProperty targetProperty, BindingBase binding);
  191. public void SetValue (BindablePropertyKey propertyKey, object value);
  192. public void SetValue (BindableProperty property, object value);
  193. protected void UnapplyBindings ();
  194.  
  195. // Events
  196. public event EventHandler BindingContextChanged { add; remove;}
  197. public event PropertyChangedEventHandler PropertyChanged {add; remove;}
  198. public event PropertyChangingEventHandler PropertyChanging {add; remove;}
  199. }
  200.  
  201. 单向数据绑定和双向数据绑定
  202. 单向:model的变更会刷新viewview上做任何操作都不影响model
  203. 双向:model的变更会刷新viewview的变更会刷新model
  204. 个人只喜欢用单向的,理由呢:
  205. 喜欢实打实的代码来控制数据刷新,双向的数据绑定总觉得不放心
  206. view的交互,常常带了逻辑控制,不仅仅是给model赋值,这不是双向数据绑定能解决的。
  207.  
  208. 其它
  209. Qt QML的属性、绑定、属性变更事件实现起来非常优美和简单
  210. A
  211. {
  212. property int Property1;
  213.  
  214. // 编译器会自动生成类似以下方法
  215. // bool onProperty1Changing(o, oldValue, newValue){...}
  216. // void onProperty1Changed(o, oldValue, newValue) {....}
  217. }
  218. b.Property2 = a.Property1; // 绑定这两个对象的属性(单向绑定)
  219. 建议 C# 优化编译器,或者提供语法糖之类的东西(如propety关键字)
  220. public readonly property string Name;
  221. 编译器自动实现:
  222. gettersetter
  223. INotifyPropertyChanged 接口
  224. PropertyChangingEvent
  225. PropertyChangedEvent
  226. 绑定逻辑
  227. 事实上,这个功能10来年前的 Delphi 就实现了
  228.  
  229. 什么是 MVC
  230. 这是将界面、逻辑、数据隔离的一种方案,这其实也是绑定的一种实现,不过是页面级别的。
  231. Model : 数据
  232. View : 视图
  233. Controller : 控制器
  234. 视图的呈现由控制器控制,视图的数据(模型)也由控制器提供
  235. TODO: 补一个简单的示例
  236. ASP.NET MVC
  237. 是一个controller对应多个view
  238. 它的controller主要就是个跳转器,根据客户端请求,组装数据并提供给某个视图,渲染到客户端
  239. 疑问:
  240. 大的页面用controller跳转好理解
  241. 但小的交互,如按钮点击页面上的某个label变个文字,这个也交给controll是不是太琐碎了?
  242. 这个还是交给页面客户端自己处理会更合适,但这要写js
  243. 其实传统的 Windows Form 也可以看为一种MVC
  244. View部分可由设计器创建
  245. View的数据展示、交互(如点击事件)在后台代码中,这个可以看成Controller
  246. 不过这种方式是一个view对应一个controller,这个controller是这个view专用的
  247. ios-objectc MVC
  248. 这货和 Windows Form 差不多,也是一个视图对应一个专用的控制器
  249. MVC的头衔,行Windows Form的行当。
  250.  
  251. 什么是 MVVM
  252. 这是将界面和数据完全隔离的一种方案
  253. Model : 模型
  254. View : 视图
  255. ViewModel : 视图模型
  256. 传统的页面数据展示,可以是混杂的,既有数据绑定,也可以掺杂代码指定。如:
  257. TODO:来段 MVVM 的示例代码
  258. 可以看出,MVVM是一种更极端的、界面和数据完全隔离的方案:
  259. 它定义了一个叫 ViewModel 的东西,这个也是一种Model,但专用于视图
  260. 视图的赋值只能用 ViewModel,不能用其它方式
  261. 我们必须为每个 View 定制一个 ViewModel
  262. 评价
  263. 好处:完全隔离视图和数据、只要约定好数据接口(ViewModel)就行
  264. 坏处:必须为每个视图都定制 ViewModel,这会增加代码量
  265.  
  266. ps
  267. - 出了个 Xamarin Live Player 的东东,可以在手机上展示程序运行效果
  268. android版本的可以直接下载,ios版本的还在testflight
  269. https://docs.microsoft.com/zh-cn/xamarin/tools/live-player/

关于Xamarin、Qml、数据绑定、MVC、MVVM 相关的散讲的更多相关文章

  1. MVP MVC MVVM 傻傻分不清

    最近MVC (Model-View-Controller) 和MVVM (Model-View-ViewModel) 在微软圈成为显学,ASP.NET MVC 和WPF 的Prism (MVVM Fr ...

  2. MVC & MVVM

    什么是MVC,什么是MVVM? 面向过程 --> 面向对象 --> MVC --> MV* 面向过程: 开发人员按照需求逻辑顺序开发代码逻辑,主要思维模式在于如何实现.先细节,后整体 ...

  3. mvc/mvvm小小的总结

    mvc/mvvm 阮大神博客 mvc 分为三层,其实M层是数据模型层,它是真正的后端数据在前端js中的一个映射模型,他们的关系是:数据模型层和视图层有映射关系,model改变,view展示也会更改,当 ...

  4. 【extjs6学习笔记】1.2 初始:MVC MVVM

    模型 这表示数据层.该模型可以包含数据验证和逻辑来保持数据.在 ext js 中, 大多数模型都与一个数据存储一起使用. 视图 这表示用户界面. 是用户在屏幕上看到的组件. 在每次互动的用户与应用程序 ...

  5. 前后端分层架构MVC&MVVM

    早期 特点 页面由 JSP.PHP 等工程师在服务端生成 JSP 里揉杂大量业务代码 浏览器负责展现,服务端给什么就展现什么,展现的控制在 Web Server 层 优点 简单明快,本地起一个 Tom ...

  6. JavaScript富应用MVC MVVM框架

    对框架的挑选 Ember.js.Backbone.js.Knockout.js.Spine.js.Batman.js , Angular.js 1. 轻量级的应用选择哪一个会比较好?2. 那一个比较简 ...

  7. 通俗理解 MVC , MVVM

    MVC 也就是Model-View-Controller 的缩写,就是 模型-视图-控制器 : Model :管理数据 View :视图展示 Controller :响应用户操作,并将 Model 更 ...

  8. MVC,MVVM模式的理解

    基本上,我们的产品就是通过接口从数据库中读取数据,然后将数据经过处理展示到用户看到的视图上.当然我们还可以从视图上读取用户的输入,然后通过接口写入到数据库.但是,如何将数据展示到视图上,又如何将用户的 ...

  9. 我的架构设计~用层关系图说说mvc,mvvm,soa,ddd

    下面是按着我所接触的架构模式,开始一个一个的说一下 第一 标准架构 三层结构

随机推荐

  1. Class.forName()+Class.forName().newlnstance()和new语句和初始化块+static初始化块+构造方法之间的关系

    先上代码 class A{     int a;     static {System.out.println("载入类时执行");}     public A() {       ...

  2. JS编码方式

    1. escape(): 采用unicode字符集对指定的字符串除0-255以外进行编码.所有的空格符.标点符号.特殊字符以及更多有联系非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符 ...

  3. 201771010126.王燕《面向对象程序设计(Java)》第六周学习总结

    实验六 继承定义与使用 实验时间 2018-9-28 1.实验目的与要求 (1) 理解继承的定义: 继承就是用已有类来构建新类的一种机制,当你继承了一个类时,就继承了这个类的方法和字段,同时你也可以在 ...

  4. Elastic 之倒排索引(二)

    常规索引建立: 文档-->关键词的映射过程(正向索引) 缺点:费时 便利全部文档 倒排反向建立索引: 关键词-->文档的映射 反向到倒排索引:将索引的关键词出现的文档的位置和出现频率通过文 ...

  5. Linux下提权常用小命令

    有些新手朋友在拿到一个webshell后如果看到服务器是Linux或Unix操作系统的就直接放弃提权,认为Linux或Unix下的提权很难,不是大家能做的,其实Linux下的提权并没有很多人想象的那么 ...

  6. 记一次FileZillaServer提权

    前段时间检测一个企业网站,在检测该企业的一个下属公司的网站时通过用户名admin和密码123456进入了后台,后台目录就是公司汉语拼音+admin,诸如xxxadmin这种形式的.在后台通过“产品图片 ...

  7. C博客作业01--分支,顺序结构

    本章学习总结(2分) 1.1思维导图 1.2本章学习体会及代码量学习体会 1.2.1学习体会 本周初次接触C语言,一开始难度较大,很多代码都看不懂,书里面的章节要看很多遍.开始编写代码时也遇到很多困难 ...

  8. 安装Office2010出现MSXML版本6.10.1129.0错误

      在键盘上按“win+R”组合键出现图图示界面后,输入“regsvr32 /u msxml6.dll”,点击“确定”. 出现图示显示后,点击“确定”,并同时去试试office是否能够安装了. 如果上 ...

  9. c++第三次实验

    第一题: 先把代码贴上来 main.cpp #include <iostream> #include <cstdlib> #include<conio.h> #in ...

  10. 2018-2019-2 20165225《网络对抗技术》Exp1 缓冲区溢出实验

    2018-2019-2 20165225<网络对抗技术>Exp1 缓冲区溢出实验 声明 虽然老师在邮箱中要求要把虚拟机名改为个人名字缩写,但是我的kali好像不是很听话...重启数次也没用 ...