diff --git a/03-UnrealEngine/UI/UE5 MVVM 笔记.md b/03-UnrealEngine/UI/UE5 MVVM 笔记.md index fdf5bab..d8d51a2 100644 --- a/03-UnrealEngine/UI/UE5 MVVM 笔记.md +++ b/03-UnrealEngine/UI/UE5 MVVM 笔记.md @@ -100,15 +100,32 @@ ViewModels管理器位于:Window -> ViewModels。 ## MVVM CreationType ### Manual(看设计,可以一对多) - 默认不创建,需要业务自己调用SetViewModel来关联 -- 可以手动把 +- 可以手动把同一个ViewModel绑定到个Widget中 ### Create Instance (一对一) -自动为控件的每个唯一实例创建一个新的Viewmodel实例。这意味着,如果你在视口中有同一控件的数个副本,并且你更改了其中一个副本的Viewmodel变量,则只有该控件会更新,所有其他副本将保持不变。同理,如果你创建多个使用同一Viewmodel的不同控件,这些控件都不会感知到彼此信息的变化。 - -**UE只会在ViewModel为空时创建新实例,ViewModel会在PreConstruct和Construct事件之间创建。** +- 在界面Construct时候会创建一个新的ViewModel +- 每个界面实例都是单独的ViewModel ### Global View Model Collection (全局共享) -[MVVMGameSubsystem](https://zhida.zhihu.com/search?content_id=259254754&content_type=Article&match_order=1&q=MVVMGameSubsystem&zhida_source=entity)中维护了一个全局访问的ViewModel列表,可以通过任意GameInstance访问。 +- GlobalViewModelCollection自动从全局的MVVMSubsystem中获取指定Name和类型的ViewModel +- 业务必须手动创建一个,并添加到MVVMSubsyste + +```c++ +const auto Collection = GEngine->GetEngineSubsystem()->GetGlobalViewModelCollection() +FMVVMViewModelContext Context; +Context.ContextClass = ViewModelClass; +Context.ContextName = "Test"; + +// 把VM添加到UMVVMSubsystem +const auto VM = NewObject(LocalPlayer, ViewModelClass, "Test"); +Collection->AddViewModelInstance(Context, VM); + +//查询VM +const auto VMResult = Collection->FindViewModelInstance(Context); + +// 从UMVVMSubsystem移除VM +Collection->RemoveViewModel(Context); +``` Note:这里注意,AddViewModel必须提供ContextName,UE要求此名称必须和ViewMode的类名一致。 原因:MVVM中维护数据使用的是TArray,内存连续,可以通过索引快速查询。