U3D MvvM框架中的数据绑定(c#)

数据驱动

    • 用处以及缺陷
    • 设计思路
    • 上代码
    • 使用方式

用处以及缺陷

Mvvm 框架中有一个很重要的思想就是数据绑定,比如某一个数据改变了,有许多界面上的东西也要相应的改变,这个时候就可以在不同的地方写一个方法,将这个方法绑定到某个数据上,当数据发生改变时,将触发调用所有绑定在这个数据身上的方法
这里有一个不如意的地方,一个数据可以被多个方法绑定没问题的,但是如果一个方法绑定了多个数据,那么每当其中一个数据变动,那么就会调用这个方法,所以一个数据的变动直接决定了一个方法的调用结果,无法由多绑定的那多个数据变化结果来共同改变这个方法的执行.

设计思路

创建一个类  class BindableProperty 
需要被绑定的数据有可能是多种类型,所以创建的类用了泛型 

创建一个委托类型 
public delegate void ValueChangedHandler(T oldValue, T newValue);

类中有一个泛型数据用来储存我们需要绑定的数据
private T mValue;

类中有一个委托列表,这个列表用来存储绑定数据的所有的委托 
private ValueChangedHandler OnValueChanged;

会被绑定的数据一般会写在代理中,以方便各个地方读取
public BindableProperty ==modulValue== = new BindableProperty(1);

上代码

using System.Collections.Generic;

public class BindableProperty<T>
{
    public delegate void ValueChangedHandler(T oldValue, T newValue);

    private ValueChangedHandler OnValueChanged;

    public BindableProperty(T value)
    {
       mValue = value;
    }
    /*
     * 当我们我的 modulValue 被赋值时应使用 modulValue.Value = 666;
     * 执行这个代码块
     */
    public T Value
    {
        get
        {
            return mValue;
        }
        set
        {
            T old = mValue;
            mValue = value;
            //当值改变时此处自动触发委托函数
            ValueChanged(old, mValue);
        }
    }
    //这个方法用以手动触发委托,但是 oldValue 和 newValue 都是用目前的值
    public void Trigger()
    {
        ValueChanged(mValue, mValue);
    }
    
    public string toString()
    {
        return (mValue != null ? mValue.ToString() : "null");
    }
    
    //传函数进来绑定本数据
    public void BindCustomHandler(ValueChangedHandler callBack)
    {
        if (callBack == null)
        {
            return;
        }
        //增加一个回调
        OnValueChanged += callBack;
    }

    public void UnBindCustomHandler(ValueChangedHandler callBack)
    {
        if (callBack == null)
        {
            return;
        }
        OnValueChanged -= callBack;
    }
    
    private void ValueChanged(T oldValue, T newValue)
    {
        if (OnValueChanged != null)
        {
        	//执行所有函数
            OnValueChanged(oldValue , newValue);
        }
    }
    
    private T mValue;
}

使用方式

  1. 代理中声明这个绑定类
	public BindableProperty<int> temp = new BindableProperty<int>(666);
	//此时temp的值是 666
  1. 需要绑定数据的地方声明一个方法
	private void OnUpdateMainButtonHudDataHandler(int oldValue, int newValue)
    {
        System.Console.WriteLine("旧值为:"+ oldValue + "新的值为:" + newValue);
    }
  1. 将声明的方法绑定数据
	private void Star()
	{
		ModlueProxy.temp.BindCustomHandler(OnUpdateMainButtonHudDataHandler);
	}
  1. 当数据改变时候就会调用到绑定的方法了
	private void Star()
	{
		ModlueProxy.temp.Value = 5666;
	}

此时会输出:
旧值为:666新的值为:5666

你可能感兴趣的:(u3d学习笔记)