vault backup: 2025-08-26 16:42:12

This commit is contained in:
2025-08-26 16:42:12 +08:00
parent 6a30668586
commit cec50501f5

View File

@@ -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<UMVVMSubsystem>()->GetGlobalViewModelCollection()
FMVVMViewModelContext Context;
Context.ContextClass = ViewModelClass;
Context.ContextName = "Test";
// 把VM添加到UMVVMSubsystem
const auto VM = NewObject<UMVVMViewModelBase>(LocalPlayer, ViewModelClass, "Test");
Collection->AddViewModelInstance(Context, VM);
//查询VM
const auto VMResult = Collection->FindViewModelInstance(Context);
// 从UMVVMSubsystem移除VM
Collection->RemoveViewModel(Context);
```
Note这里注意AddViewModel必须提供ContextNameUE要求此名称必须和ViewMode的类名一致。
原因MVVM中维护数据使用的是TArray内存连续可以通过索引快速查询。