vault backup: 2025-08-26 16:42:12
This commit is contained in:
@@ -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必须提供ContextName,UE要求此名称必须和ViewMode的类名一致。
|
||||
原因:MVVM中维护数据使用的是TArray,内存连续,可以通过索引快速查询。
|
||||
|
Reference in New Issue
Block a user