お世話になっております。
UMG ViewModelを使ってUI開発をしております。
こちらを使用する中で、以下のようなユースケースに対応する際の考慮が必要となっておりました。
----------------------------------------------------------------------------------------------------
前提:初期化時に一度だけViewModelからWidgetへデータを設定したいので「OneTime To Widget」を使いたい
課題:初期化データをViewModelに渡すタイミングが、UMVVMViewのSetViewModelでViewModelを渡す前であることを考慮する必要がある
解決まで:
- UMVVMViewのSetViewModelにセットした時点で「OneTime To Widget」のバインディングが発火してしまう
- その後ViewModelへ初期化データを設定すると「OneTime To Widget」が発火しない
- 2までの流れを踏まえて、SetViewModelは2を実行した後に行う必要があることを確認
----------------------------------------------------------------------------------------------------
今回のようなケースに対応する場合、例えば今後ViewBindingにて以下のような内容のタイプが追加される予定などございますでしょうか
・UMVVMViewのSetViewModelが実行された後、初回のデータ更新時のみ発火する
このタイプがあればViewの初期化を一度だけ行うような内容について、ViewModelの設定タイミングを気にせずに行えるかと考えております。
もし既存のしくみで既に対応可能であれば申し訳ございません。
何卒ご確認のほど、よろしくお願いいたします。
[Attachment Removed]
お世話になっております。
大変恐縮ながら、ご希望の「初回データ更新まで待機して1回だけ発火する」というモードを追加するタスクは、現在のところは社内の計画に存在しておりません。
代替案として、バインディングのタイミング(=One Time To Widget の発火タイミング)を手動でずらす方法をご案内します。まず、下図を参考にビューモデルの設定を開いていただき(Details Panel側に開きます)、
[Image Removed]下図のように、Initialize Bindings on Construct のチェックを外すことで、 初期化時にバインディング設定が構築されることを防止します。これにより、 SetViewModel() を呼び出した際に One TIme To Widget が発火することもなくなります。
[Image Removed]
ランタイムのコードにおいて、ビューモデルに初期値を設定したあと、UMVVMViewのInitializeBindings()を手動で呼び出せば、 One Time To Widget が発火します。
ご覧いただきました通り、このアプローチではビューモデルの初回更新後に手動でバインディングの初期化を呼び出す必要があります。ビューモデルの更新側がビューの存在について「知らない」という設計が徹底されている場合、InitializeBindings()の手動呼び出しをベストタイミングで行うことが難しく、使用しづらいかもしれません。
その場合の次善の策は、バインディング設定を「One Way To Widget」に変更し、ビューモデルの初回更新後の更新を控える…という形になるかと思います。
以上、よろしくお願いいたします。
[Attachment Removed]
いつもお世話になっております。
伺いました内容であれば任意のタイミングでOneTimeの実行が出来るため問題無さそうです。
特にViewModelのCreationTypeをCreateInstanceで作成した際に、OneTimeの実行制御が可能なところで非常にありがたいオプションと感じております。
詳細な調査結果をフィードバックいただき誠にありがとうございました。
[Attachment Removed]
回答のご確認をありがとうございました。
提案した方法でご要件が満たせそうだということで安心いたしました。
他の「Initialize~」オプションもConstruct時に自動で実行される処理を抑止し、手動で実施タイミングをコントロールできるオプションとなっておりますので、状況に応じてご活用ください。
それでは本件は対応済みとしてCloseさせていただきます。
以上、よろしくお願いいたします。
[Attachment Removed]