首页 > 代码库 > Unity uFrame 1.6 MVVM 学习笔记(一)

Unity uFrame 1.6 MVVM 学习笔记(一)

未写完......

Sub System

  技术分享

  生成一个类:

    1.UISysLoader

      可重写方法:

        Load

      属性,方法:

        this.EventAggregator   事件聚合器(虽然有些类也有该方法,看源码好像有些不一样,待检验异同)

        this.Container      怀疑是集合类型的容器,即集合的父节点,待检验

        this.CreateViewModel   怀疑是创建一个ViewModel。

        this.GetView        得到参数下的ViewBase类

        this.GetViewModel    内部通过GetView方法得到View,再取得View下的ViewModelObject属性

Scene Type:

      技术分享

  生成三个类:

    1.MainScene

      可重写方法执行顺序:

        Start,KernelLoading,KernelLoaded,OnDestroy

      属性,方法:

        this.DefaultKernelScene  内核场景的名字

        this.EventAggregator   事件聚合器

        this.OnEvent      Wait for an Event to occur on the global event aggregator

        this.Publish        Publishes a command to the event aggregator. Publish the class data you want, and let any "OnEvent" subscriptions handle them.

        this.Settings      对应生成的MainSceneSettings类,不知是否只能通过this.Settings = new MainSceneSettings();来赋值

        this._SettingsObject  作为this.Settings的内部赋值变量

    2.MainSceneLoader

      可重写方法执行顺序:

        Start,KernelLoading,KernelLoaded,LoadScene,UnloadScene,OnDestroy

      属性,方法:

        this.EventAggregator   事件聚合器

        this.OnEvent      Wait for an Event to occur on the global event aggregator

        this.Publish        Publishes a command to the event aggregator. Publish the class data you want, and let any "OnEvent" subscriptions handle them.

        this.SceneType     暂时未知有什么作用。

           技术分享

    3.MainSceneSettings

Element

  技术分享

  生成两个类:

    1.LoginSceneViewModel

      可重写方法执行顺序:

        Bind,FillProperties,FillCommands

        未知:

        ExecuteLogin,MethodAccessException,,Read,Unbind,WireCommands,Write

 

      属性,方法:

        太多,日后挑重要写。

        this.SetupBindings()  This method will ensure that a view-model exists and then call the bind method when it‘s appropriate.设置重新绑定,但要在合适的时机调用,比如在AfterBind()里调用会卡死。

      API解释:

      OnPropertyChanged  当ViewModel中的属性更改时触发该方法。如果View有绑定属性改变事件,该事件先于OnPropertyChanged执行。

      Write,Read  主要负责数据序列化与反序列化的工作

    2.LoginSceneController

      可重写方法执行顺序:

        Setup,SetupAsync,Create,CreateEmpty,InitializeLoginScene,Initialize

        未知:CreateLoginScene,DisposingViewModel,Dispose

        条件顺序:Login,LoginHandler(触发对应的事件一起执行)

      属性,方法:

        this.Container      怀疑是集合类型的容器,即集合的父节点,待检验

        this.EventAggregator     事件聚合器

        this.OnEvent      Wait for an Event to occur on the global event aggregator

        this.Publish        Publishes a command to the event aggregator. Publish the class data you want, and let any "OnEvent" subscriptions handle them.

        this.LoginSceneViewModelManager  暂时故名思意,即ViewModel管理者,看了源码,主要有添加/删除ViewModel的功能。主要是相关联的ViewModel的管理类属性

        this.LoginSceneViewModels       暂时故名思意,即ViewModels,看了源码,从LoginSceneViewModelManager取得

        this.ObserveEveryValueChanged   Publish target property when value is changed. If source is destroyed/destructed, publish OnCompleted.

      备注:

        1.在Commands里写的方法会在Controller里重写两个方法,一个Login,LoginHandler(后执行),但LoginHandler参数command.sender是对应的ViewModel,因此猜测这个方法主要用来执行完Login后的一些处理。

View(必须连一个Element)

 

  技术分享

  生成一个类:

    1.LoginView

      可重写方法执行顺序:

         OnEnable,Start,Update,SetIdentifierSilently,PreBind,Bind,AfterBind,KernelLoading,KernelLoaded,OnDisable,DisposeBindings,Unbind,OnDestroy

        未知:InitializeViewModel(在面板点击InitializeViewModel才会执行),ExecuteLogin,Write,Read

      属性,方法:

        太多,日后挑重要写。主要是一些绑定处理。

      API解释:

        1.ExecuteLogin对应Controller的Login和LoginHandler方法,也就是说View可以直接执行Controller的方法?


 备注:

  1.View的一些执行比内核快(例如Update),也比uFrame场景加载快(为什么这么设计?),或者这就是在View里直接使用ViewModel会报空指针的原因

    View里直接使用ViewModel要在Bind后使用,因为Update比Bind先执行

  2.Controller的Step和SetupAsync执行比较早

  3.在MainSceneLoader的OnDestory前最好执行一遍UnloadScene,因为怀疑他没有卸载场景。

  4.坑点:因为Service里不能直接注入不是Instance的是ViewModel,因此我把一个ViewModel在uFrame设计中设置为了Instances.

      但是在Service中注入使用时发现没有同步View面板InitializeViewModel自己初始化的数据。

      需要在面板InitializeViewModel上点击Use Rigistered ...才可以同步。那这个Use Rigistered到底是什么?

      在这里大胆猜测是创建一个实例给其他地方通过引用来使用。否则就是创建多个实例。

Unity uFrame 1.6 MVVM 学习笔记(一)