QFramework (v0.1.x)入门学习(九)MVP入门(2)

本文介绍在Unity中如何利用ReactiveProperty实现UI与数据模型的绑定,通过具体代码示例展示如何监听类属性变化,并在UI中实时更新。同时,文章还提及了ReactiveCollection的序列化特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

跟上一篇大同小异,上一篇监听的是单个值,这里监听的是类

1.

  public ReactiveProperty<TodoItem> SelectedModel = new ReactiveProperty<TodoItem>();

2.

    Button.onClick.AddListener(() =>
            {
                SelectedModel.Value = mModel;
                //Debug.Log("UITodoItem  " + SelectedModel.Value.Content);

            });

3.

      public void AddTodoItem(UITodoItem itemPrefab, TodoItem itemData)
        {
            itemPrefab.Instantiate()
                      .Parent(this)
                      .LocalIdentity()
                      // 委托传递, 遍历传递item(即TodoItem类)到自己的 UITodoItem类的Init()方法
                      .ApplySelfTo(self => self.Init(itemData))
                      .ApplySelfTo(self => mItemViewsForData.Add(itemData, self))
                      .ApplySelfTo(self => self.SelectedModel.Skip(1).Subscribe(model => SelectedModel.Value = model))
                      //.ApplySelfTo(self => self.SelectedModel.Skip(1).Subscribe(model => Debug.Log( "UIListCtrl  " +  SelectedModel.Value.Content)))
                      .Show();
        }

 

还有个小知识是 ReactiveCollection 是可序列化的

using QF;
using QF.Extensions;
using QF.Res;
using QFramework;
using QFramework.Afra;
using UniRx;
using UnityEngine;

/// <summary>
/// TodoApp
/// 1. 完成,未完成
/// 2. 列表/待办事项
/// 3. 增加,删除,更改待办事项
/// 
/// 有一个列表,列表里多个待办事项, 待办事项能够完成未完成 ,内容
/// </summary>
public class TodoListApp : MonoBehaviour
{
    public TodoList mModel;
    void Start()
    {
        ResMgr.Init();
        UIMgr.SetResolution(1080, 1920, 0);
        mModel = TodoList.Load();
        // 打开 panel
        UIMgr.OpenPanel<UITodoList>(new UITodoListData()
        {
            // 将Model层数据 传递到 UIPanel 控制层
            Model = mModel
        }) ;
    }
    private void OnApplicationQuit()
    {
        mModel.Save();
    }
}

public class TodoList
{
    public ReactiveCollection<TodoItem> TodoItems = new ReactiveCollection<TodoItem>();

    public void AddTodo(string content)
    {
        var todoItem = new TodoItem();
        todoItem.Content.Value = content;
        TodoItems.Add(todoItem);
    }
    // Json 反序列化(读取)
    public static  TodoList Load()
    {
        var jsonContent = PlayerPrefs.GetString("TodoListData", string.Empty);
        return jsonContent.IsNullOrEmpty() ? new TodoList() : jsonContent.FromJson<TodoList>();

    }
    //Json  序列化(写入)
    public void Save()
    {
        PlayerPrefs.SetString("TodoListData ", this.ToJson());
    }

}
public class TodoItem
{
    public BoolReactiveProperty Completed = new BoolReactiveProperty (false);
    public StringReactiveProperty Content = new StringReactiveProperty (string.Empty);
}